From c17e37df6a6462bb0f40c38dc3a482057e516495 Mon Sep 17 00:00:00 2001 From: Bill Monkman Date: Tue, 5 Oct 2021 18:24:08 -0700 Subject: [PATCH 1/3] feat: Added support for modules being able to supply a default value for a parameter when the condition is not met. Also improved documentation. --- README.md | 12 +- cmd/zero.go | 12 +- doc-site/docs/reference/module-definition.md | 155 ++++++++-------- {docs/img => doc-site}/logo.png | Bin docs/img/zero-check.png | Bin 130895 -> 0 bytes docs/learning-resources.md | 26 --- docs/module-definition.md | 90 ---------- docs/project-definition.md | 27 --- docs/real-world-usage.md | 49 ----- docs/technology-choices.md | 167 ------------------ go.mod | 14 +- go.sum | 135 ++++++++++---- internal/config/moduleconfig/module_config.go | 11 ++ internal/config/projectconfig/init.go | 5 +- internal/init/prompts.go | 26 ++- internal/init/prompts_test.go | 21 ++- 16 files changed, 250 insertions(+), 500 deletions(-) rename {docs/img => doc-site}/logo.png (100%) delete mode 100644 docs/img/zero-check.png delete mode 100644 docs/learning-resources.md delete mode 100644 docs/module-definition.md delete mode 100644 docs/project-definition.md delete mode 100644 docs/real-world-usage.md delete mode 100644 docs/technology-choices.md diff --git a/README.md b/README.md index 14c1c2a7e..4aa40c972 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Slack](https://img.shields.io/badge/slack-join-brightgreen?logo=slack&style=social)](https://slack.getzero.dev)

- +

## What is Zero @@ -23,7 +23,7 @@ Everything built by Zero is yours. After using Zero to generate your infrastruct It's easy to get started, the only thing you'll need is an AWS account. Just enter your AWS CLI tokens or choose your existing profile during the setup process and everything is built for you automatically using infrastructure-as-code so you can see exactly what's happening and easily modify it if necessary. -[Read about the day-to-day experience of using a system set up using Zero](docs/real-world-usage.md) +[Read about the day-to-day experience of using a system set up using Zero](https://getzero.dev/docs/zero/about/real-world-usage) ## Why is Zero Reliable, Scalable, Performant, and Secure @@ -36,9 +36,9 @@ Security: Properly configured access-control to resources/security groups, using ## What do you get out of the box? -[Read about why we made these technology choices and where they are most applicable.](docs/technology-choices.md) +[Read about why we made these technology choices and where they are most applicable.](https://getzero.dev/docs/zero/about/technology-choices) -[Check out some resources for learning more about these technologies.](docs/learning-resources.md) +[Check out some resources for learning more about these technologies.](https://getzero.dev/docs/zero/reference/learning-resources) ### Infrastructure - Fully configured infrastructure-as-code AWS environment including: @@ -78,12 +78,12 @@ ___ ### Project Definition: Each project is defined by this project definition file, this manifest contains your project details, and is the source of truth for the templating(`zero create`) and provision(`zero apply`) steps. -See [`zero-project.yml` reference](./docs/project-definition.md) for details. +See [`zero-project.yml` reference](https://getzero.dev/docs/zero/reference/project-definition) for details. ### Module Definition Module definition defines the information needed for the module to run (`zero apply`). Also declares dependency used to determine the order of execution with other modules. -See [`zero-module.yml` reference](./docs/module-definition.md) for details. +See [`zero-module.yml` reference](https://getzero.dev/docs/zero/reference/module-definition) for details. ___ diff --git a/cmd/zero.go b/cmd/zero.go index a8f18c0df..c25c0e593 100644 --- a/cmd/zero.go +++ b/cmd/zero.go @@ -1,7 +1,6 @@ package cmd import ( - "fmt" "os" "github.com/spf13/cobra" @@ -10,14 +9,17 @@ import ( var rootCmd = &cobra.Command{ Use: "zero", Short: "zero gets you to writing code quicker.", - Long: "Zero is an open-source developer platform CLI tool which makes it quick and easy for technical founders & developers \nto build quality and reliable infrastructure to launch, grow and scale high-quality SaaS applications faster and more cost-effectively.", + Long: "Zero is an open-source CLI tool which makes it quick and easy for technical founders & developers \nto build high-quality, reliable infrastructure to launch, grow, and scale production-ready SaaS applications faster and more cost-effectively.\n https://getzero.dev\n", Run: func(cmd *cobra.Command, args []string) { }, } func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + if len(os.Args) > 1 { + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } + } else { // If no arguments were provided, print the usage message. + rootCmd.Help() } } diff --git a/doc-site/docs/reference/module-definition.md b/doc-site/docs/reference/module-definition.md index 9bd419fb9..6c6fdd475 100644 --- a/doc-site/docs/reference/module-definition.md +++ b/doc-site/docs/reference/module-definition.md @@ -6,93 +6,100 @@ sidebar_position: 1 ### `zero-module.yml` This file is the definition of a Zero module. It contains a list of all the required parameters to be able to prompt a user for choices during `zero init`, information about how to template the contents of the module during `zero create`, and the information needed for the module to run (`zero apply`). -It also declares the module's dependencies to determine the order of execution in relation to other modules. +It also declares the module's dependencies to determine the order of execution in relation to other modules. -| Parameters | type | Description | -|---------------|--------------------|--------------------------------------------------| -| `name` | string | Name of module | -| `description` | string | Description of the module | -| `template` | template | default settings for templating out the module | -| `author` | string | Author of the module | -| `icon` | string | Path to logo image | -| `parameters` | list(Parameter) | Parameters to prompt users | -| `commands` | Commands | Commands to use instead of makefile defaults | -| `zeroVersion` | string([go-semver])| Zero versions its compatible with | +| Parameters | type | Description | +|---------------|----------------------|--------------------------------------------------| +| `name` | `string` | Name of module | +| `description` | `string` | Description of the module | +| `template` | `template` | default settings for templating out the module | +| `author` | `string` | Author of the module | +| `icon` | `string` | Path to logo image | +| `parameters` | `list(Parameter)` | Parameters to prompt users | +| `commands` | `Commands` | Commands to use instead of makefile defaults | +| `zeroVersion` | string([go-semver]) | Zero versions it's compatible with | ### Commands -Commands are the lifecycle of `zero apply`, it will run all module's `check phase`, then once satisfied run in sequence `apply phase` then if successful run `summary phase`. +:::note +Commands are the lifecycle of `zero apply`, it will run all modules' `check` phase, then once satisfied, run in sequence the `apply` phase, then if successful run the `summary` phase. +::: -| Parameters | Type | Default | Description | -|------------|--------|----------------|--------------------------------------------------------------------------| -| `check` | string | `make check` | Command to check module requirements. check is satisfied if exit code is 0 eg: `sh check-token.sh`, `zero apply` will check all modules before executing | -| `apply` | string | `make` | Command to execute the project provisioning. | -| `summary` | string | `make summary` | Command to summarize to users the module's output and next steps. | +| Parameters | Type | Default | Description | +|------------|----------|----------------|--------------------------------------------------------------------------| +| `check` | `string` | `make check` | Command to check module requirements. check is satisfied if exit code is 0 eg: `sh check-token.sh`, `zero apply` will check all modules before executing | +| `apply` | `string` | `make` | Command to execute the project provisioning. | +| `summary` | `string` | `make summary` | Command to summarize to users the module's output and next steps. | #### Template -| Parameters | Type | Description | -|--------------|---------|-----------------------------------------------------------------------| -| `strictMode` | boolean | whether strict mode is enabled | -| `delimiters` | tuple | A tuple of open delimiter and ending delimiter eg: `<%` and `%>` | -| `inputDir` | string | Folder to template from the module, becomes the module root for users | -| `outputDir` | string | local directory name for the module, gets commited to version control | - -### Condition(module) -Module conditions are considered during template phase (`zero create`), based on parameters supplied from project-definition, -modules can decide to have specific files ignored from the user's module. For example if user picks `userAuth: no`, we can ignore the auth resources via templating. - -| Parameters | Type | Description | -|--------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -| `action` | enum(string) | type of condition, currently supports [`ignoreFile`] | -| `matchField` | string | Allows you to condition prompt based on another parameter's value | -| `WhenValue` | string | Matches for this value to satisfy the condition | -| `data` | list(string) | Supply extra data for condition to run `ignoreFile`: provide list of paths (file or directory path) to omit from module when condition is satisfied | - -### Parameter: -Parameter defines the prompt during zero-init. +Control how module templates will be parsed during the `zero create` command. + +| Parameters | Type | Description | +|--------------|-----------|-----------------------------------------------------------------------| +| `strictMode` | `boolean` | whether strict mode is enabled | +| `delimiters` | `tuple` | A tuple of open delimiter and ending delimiter eg: `<%` and `%>` | +| `inputDir` | `string` | Folder to template from the module, becomes the module root for users | +| `outputDir` | `string` | local directory name for the module, gets commited to version control | + +### Condition (module) +Module conditions are considered during the templatint phase (`zero create`), based on parameters supplied from the project definition. +Modules can decide to have specific files or directories excluded from the user's project. +For example if the user picks `userAuth: no`, we can exclude all the auth resources via templating. + +| Parameters | Type | Description | +|--------------|----------------|-------------------------------------------------------------------------------------------------------------------------------| +| `action` | `enum(string)` | type of condition, currently supports [`ignoreFile`] | +| `matchField` | `string` | Allows us to check the contents of another parameter's value | +| `WhenValue` | `string` | Matches for this value to satisfy the condition | +| `data` | `list(string)` | Supply extra data for the condition action. `ignoreFile`: list of paths (file or directory) to omit from the rendered project | + +### Parameter +Parameter defines how the user will be prompted during the interview phase of `zero init`. There are multiple ways of obtaining the value for each parameter. -Parameters may have `Conditions` and must be fulfilled when supplied, otherwise it skips the field entirely. +Parameters may have `Conditions` that must be fulfilled, otherwise it skips the field entirely. The precedence for different types of parameter prompts are as follow. -1. Execute -2. type: specific ways of obtaining values (in AWS credential case it will set 2 values to the map) -3. value: directly assigns a value to a parameter -4. prompt: requires users to select an option OR input a string -Note: Default is supplied as the starting point of the user's manual input (Not when value passed in is empty) - -| Parameters | Type | Description | -|-----------------------|-----------------|---------------------------------------------------------------------------------------------------------------------------| -| `field` | string | key to store result for project definition | -| `label` | string | displayed name for the prompt | -| `options` | map | A map of `value: display name` pairs for users to pick from | -| `default` | string | Defaults to this value during prompt | -| `value` | string | Skips prompt entirely when set | -| `info` | string | Displays during prompt as extra information guiding user's input | -| `fieldValidation` | Validation | Validations for the prompt value | -| `type` | enum(string) | Built in custom prompts: currently supports [`AWSProfilePicker`] | -| `execute` | string | executes commands and takes stdout as prompt result | -| `omitFromProjectFile` | bool | Field is skipped from adding to project definition | -| `conditions` | list(Condition) | Conditions for prompt to run, if supplied all conditions must pass | -| `envVarName` | string | During `zero apply` parameters are available as env-vars, defaults to field name but can be overwritten with `envVarName` | - -### Condition(paramters) -Parameters conditions are considered while running user prompts, prompts are +1. `execute`: If this parameter is supplied, the command will be executed and the value will be recorded +2. `type`: zero-defined special ways of obtaining values (for example `AWSProfilePicker` which will set 2 values to the map) +3. `value`: directly assigns a static value to a parameter +4. `prompt`: requires users to select an option OR input a string +Note: `default` specifies the value that will appear initially for that prompt, but the user could still choose a new string or entirely erase it + +| Parameters | Type | Description | +|-----------------------|-------------------|---------------------------------------------------------------------------------------------------------------------------| +| `field` | `string` | Key to store result for project definition | +| `label` | `string` | Displayed name for the prompt | +| `options` | `map` | A map of `value: display name` pairs for users to pick from | +| `default` | `string` | Defaults to this value during prompt | +| `value` | `string` | Skips prompt entirely when set | +| `info` | `string` | Displays during prompt as extra information at the top of the screen guiding user's input | +| `fieldValidation` | `Validation` | Validations for the prompt value | +| `type` | `enum(string)` | Built-in custom prompts: currently supports [`AWSProfilePicker`] | +| `execute` | `string` | Executes commands and takes stdout as prompt result | +| `omitFromProjectFile` | `bool` | Field is skipped from adding to project definition | +| `conditions` | `list(Condition)` | Conditions for prompt to run. If supplied, all conditions must pass. See below. | +| `envVarName` | `string` | During `zero apply` parameters are available as env vars. Defaults to field name but can be overwritten with `envVarName` | + +### Condition (parameter) +Parameter conditions are considered while running user prompts. Prompts are executed in order of the yml, and will be skipped if conditions are not satisfied. -For example if a user decide to not use circleCI, condition can be used to skip the circleCI_api_key prompt. +For example if a user decides to not use circleCI, a condition can be used to skip the circleCI_api_key prompt. -| Parameters | Type | Description | -|--------------|--------------|-------------------------------------------------------------------| -| `action` | enum(string) | type of condition, currently supports [`KeyMatchCondition`] | -| `matchField` | string | Allows you to condition prompt based on another parameter's value | -| `WhenValue` | string | Matches for this value to satisfy the condition | -| `data` | list(string) | Supply extra data for condition to run | +| Parameters | Type | Description | +|--------------|----------------|-------------------------------------------------------------------| +| `action` | `enum(string)` | type of condition, currently supports [`KeyMatchCondition`] | +| `matchField` | `string` | The name of the parameter to check the value of | +| `whenValue` | `string` | The exact value to match | +| `elseValue` | `string` | The value that will be set for this parameter if the condition match fails. Otherwise the value will be set to an empty string. | +| `data` | `list(string)` | Supply extra data for condition to run | ### Validation +Allows forcing the user to adhere to a certain format of value for a parameter, defined as a regular expression. -| Parameters | type | Description | -|----------------|--------------|-------------------------------------| -| `type` | enum(string) | Currently supports [`regex`] | -| `value` | string | Regular expression string | -| `errorMessage` | string | Error message when validation fails | +| Parameters | type | Description | +|----------------|----------------|-------------------------------------| +| `type` | `enum(string)` | Currently supports [[regex](https://github.com/google/re2/wiki/Syntax)] | +| `value` | `string` | Regular expression string | +| `errorMessage` | `string` | Error message when validation fails | -[go-semver]: https://github.com/hashicorp/go-version/blob/master/README.md \ No newline at end of file +[go-semver]: https://github.com/hashicorp/go-version/blob/master/README.md diff --git a/docs/img/logo.png b/doc-site/logo.png similarity index 100% rename from docs/img/logo.png rename to doc-site/logo.png diff --git a/docs/img/zero-check.png b/docs/img/zero-check.png deleted file mode 100644 index b965831d6580efb7c2220ccaed15522eedc3dd6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130895 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 y}ZkFj{QDHyP6&|b9H~Ln6D@WBk zrk@Ie9q!h}cnRvtVGGWKp^}jGoc>1!B`Xb#N;YJx#*6qju5Z)1n{3XeeBYJ*f~U{( zLQajO0`c1n`aV(uGWR8ynr(ZUS)XbicJm`YRnIMjD2HqOiG6dny}x3CHmz5!a{w>{ zg>!b00o4de%1T#t`Zp9gcnD(!IYdfjD4Zp9D9nZY%5}cV_Wj;V)1w)kD{8JabwRCB z8#?r?{;eiAz;V7xQTRC1<*O@T4P7qWDfRif$Qdu}6b9=_y|0Lt*njk4Lt(^p9CEg~ z1@y4AHW}3b;rnYL343sOQ>^UJN~t24K6L!DM}bPieS(e7*T( zZEW)kg-xu9yR&~igU_P&TF++nbz=<|(3m29tMoN$j4?7O;_#=iHgmSRevzo4@$Ckx zzQlvA-na1F!k>6%%@U<})*S`d8x=vRT71{Mi!6--dHo@OOM&m3IgJaXylexCKz)Ec zeo+oK6tH&aF3CfJn0X@6ju(OHhpw4pA-P1Zxsl$rnG@T7{9JJqKa~6zb z8`ZWwKu4%k4^0W82~fJDBRK6ltJ>f6b90_*7F=+kd?aS~^!; zjm!t~;Z=Ers|Tfn=!8^~VckqC9)P+&eEvfJs6z#E`RPP(6T8Ed9Y3QG>+yHx#CtBG zd?$4R!a};ia3|qlJqg@~Hdr?&^+d2uBYW>j^#G%Jj8ngeXF#DsykF022I;14ytvc! zVpYRsua;A$5{rMbc*MguK-)g~pKQ-_F$#$S3Pf>qOq?o<(jllA!1PE=)^S=ReFj z%L=Z%5DT{HnZgG4g!6MWav2KDs*jx->%ft>b4?cuooD=H9=(Rgpql*Zt#Q7vaDj_} z(d*GFJf|OwN1mJESmD@r1^U8A1Tz-J$=J89YVIYKOS|>T@N)=19DDgr<6P21*OJ@^ zBks$qa@c^3QZoPV0)<;D^r zK2P`@g?6N-Y?nRjcaXjiD z+{^i}MydSO$mc{P+oE+ za?8Sa2C=Gi&aiIKi|+tl0W_u#S8<|bDgL0J%8A7@8#p605&OieJH~w8LMFpm3&rmY z$I$IO>q??4+(11x86Zsb(s`F5iT_K`@Z~8Y>iIqT@=#!QkI|_BRt(25MJJ+iKQbG1 z6_3Cb)*R_jws#iml$^)X3*M>CN-O|eeyX@=7idUz87>QpMUzx(p2AB?@7*Ww%4@!n zh1078E_O!72HghKEU=dqKbpdiv`fGsq1}7XJf}`{r%+HDAf#TUWLZSP0l(mi)t(Qh zkV}fff}4v+xJM;UHjxk?d>%+D>A@0{*QB=})^4VYgjcH!!aHOiJwmM)nge;qE9B1# z@?jt#@kE*b=~PKR7K~-<7;>I$43!RJ$q_bxe7f1GWn+uFAiq>!uG<~!mEns@(`o_L zAd-w?X}%%N;r$msq*6ZF#I{NmRq@RS>hatADOjVI?TnuBcsjyvGTdLJQlU*?jbBI@ zl5(m(d@fasVVofynCv<#FvlGYv{y}jVB52%aTP=sVZ!?%W>}@J-5xlkhcdeeGxf`q zd^>VkrxT9bg${1tOSkD0JZ07&H2#D+nDsI+Fe5xYT9iKqV8IfKY8{?!8u8N8qo5{Y4C2 zmhF@IT)VVv?cE)4u{aUeSu^Z7UU#GQ-Z9*hqLAlfw8Ow@Wli>`gQ^1^39dCh%ktPW zCAG5jEnWMCxlx(gr7-st{nNB&+CM;UcM^T8?$AdJPo(ixmSO9on^wT;`C~^co1dO8 zpyufJ^Kw!S^@V)p--4I6EXj2gZ*TS$(J4Yh&@jeS{1^>dVW^6^%r9-Z#%^--F;yUI zkC4M&hPABvWxz;5^GtpsvG6 z&ul&D;RC=G4x|=daKk98-aLgnbd7Tu16fheM%T)ZFXmiP!v|rkMFFr_?HNqc<`B{a z=gNW3%{cbgOKj;N7mjRxmm~D1Y*tKYsO)R2bFvsq-o3SvTAj`7DB)d3&@OEi#zDsF z@G9hFogBiK^r(73Qz|1DmQzd4>Vh37jPpt4fC?H0Wp&05h1g6$d;QmG4Gfv%xuci0 zQO9emsmW=eSLk0*WnUUX`%M$n)srsThyMA!4+Zs}&1?WJH?=n&N-K5R-~+7{1_u+Q zpHv+G`W7PUdeSJ-4eu1<-NZlevD^WZt4*0Um4O%)P5sTqLt zVn(8=;dkcg67TpVkJ>-yDEHD%6Uc0BPOy;7)XwF5sP4PiO>AL=1-A#TbLHdTNZ7k_ zm2kh6aKt$2Zja4Su7qp>Mpfp~L&!OjX(3i)0vH?yvYD-}=J5J0cpl%e{j?CTkaHvr zt5;lj6fl|psmqM${yClmxy_fE+-Lay-S&JP1Xz_gz8aw2dopCejL<+6Jx5sj3_ zX{KZ2Q-Kjm$8_v(EQo9xh)cO#MVg2LMI7OJj`WKVFzRtIo1=Psf&ipjO4T?)5w6RR zBW$sZit$>vYsfn8u#GCarsu?P@y+W+LX2P`{*v!iS9k!pf3JOC3oC&qW58%w?ep~9 zf$tKj`9=5{TPEOm7g1I10pp21kV?^I*YVD|*BaJF=ZmA*P4imVW_*6=WZ18;t|#r< zpzUAGyAE}7n2LqIJ?_h0pDHvM>gkK0V=OZ>96kAJBESV<9y-*ntixX#-M0&_H5AQk--+3sGkr7>L*nZzT@jCstJJz{DO?-yiaBek%=$VoS?V9ZvMNo} zU0wii_x(i9!owP;RmDhC<1MT%5YrXqQJ490E1D9k{VJ6M7*S$<=Tp)&%TzmwnG(J! zkPX=GFifV{G;!6$dl`|tjWsUUG z>A4AATJ$2ezUvNu?9QKG$-y=fn9?_m$wtOmQqFH>Phr{msJwfMHNjPJ5BL?mS>^lOd z@?3tVZg}F_bEWWKd^&mTe1n^ZuFLYi?co}pymS0r!0>&isbb^Z_C_!x3LBg5JOS|J zEmHreI{Lkb)NTvu0jG-n4MgQqu}-~43)&##DDN>tpp{G!)XpQ!>-*;9Yr#jz8_*ECd~H*(CGq@qlOGBwnm7XhI*Vf+En@w%qe|y)XE& z4{chl3mn|e;?WEiB`kj<>XY7tIXjrL?|FMS96HTjht`1%^r-8q;97H%2D!Z3+bLC~ z>!keUz8uNZ=eNbg}o*{$3RG%;zP zjc0)>+v zo=oL<3%>WPH1v1}s;m2>0SkEy%B0jky1yCy)>pW*Gpmu4unKJ5Lb4uGiiqD%e5l+R z*%9}3TZ!=u-xtT|a+iNFiV zW5eD#aAFm{yug}2kSm;CAxQBSgVzuk&m!gd@uh5K+gl{8KE>J{ zg683Aajsq*q|SeFU(6{Wj7sCP7s`*`wgE!)ORwMtNCXLBk@?u#OhEM0vD&476Z9ty zA;4YL|7O_G|9R`so{#CnmPJJC&``6HU0O$3;z6Oa2!mo2^R0z#3;jd6?xLY((L)iJf zLwd16uYspimi1{pWf{#M_qQo5_K(;hSPErmjZ;y_8yUCes}t){y?=3no`41E>9lf*d8E--`#ce=c+ zf8Kr<0&P31zM@D^qsjGoOC0*~#meE!we_3kjlI>NCAOAN1PoZK8n#2`c5{3h9msK8 z9m;F#Jj>3H|NVZibncs?TQkFcap}WA62TNwXuqM&%e&9RHJ&afhaW0zi?%Q6)$x7G zfffgKKvw|zUGs%s>RP4mNJZ_9h$PPoyUy4VA%f=tf{VrkRM7J$bbW~mJ+33QbP>`B z+2$yG%{{b>n)!^uuEj`_BQvTlvQVLoj%(QB!7;xg`$xYgR$S5^+m8)o9?lGo<5yNq zYO?@~D`CvAnB(go3v>C?pFV3uTOUMq63BPfY{4r|5C9RpzoFX%+Wy z>J|<6A$DlJP!8xCAoRwhGgH8vb_vfrht*JfG7>(+hlAH)f&ne35+fogm3M z5>(5!oeV)jQ`F43bB=;)XLZlfTg8VHH?VO@d_u~B#;%RDhwG^n^}ctv;Fq};StPmV z;#r~PycFbSgO}A8X1a@;rnZbaZed|Z*T0ri?g4xnr518#b$H#E0tZ7H>%Q5zgXZT% zV8&>k+#d(<&jMSvrI0=<GN!8bP&#BTaWb|a(9MG?9E^}0kA3!vLH%%?BDR}b9 zv|bl*sgk!>9C)5oIJZBIKgDt(%afuG(w88PamIsWl>pz=xo~}S_dz%6!;>b3xrjeN z0J0bk#<=!l%uh`A7rR20;*C98)3nxhWkVH)7FC!me9wE+D$dw-~II_jK$J&v_!5I!olvr;F>w%1v2 z52s}W(pdhm&JvtLc4}7pd2YV5d~gCu;c&BeWrbsuM_E`=!noY``@oDHf}Q^R)wI#w z8>jQuHv5`UCB4|Ly937_73^`}J8v-vKl`C+DaG_|T>E=XKPLR{ufT5PdZKZE!;1?N z2dI<5NSupT7RlYWDcV9BAHM%FU2EZ8eFeiC^l46wB#ca`yyktZ?ozwHp+&-Xbw3jE z+~kjgP50z6wZF%@$&<$VfvsaBU&PC_dM5wnddv<{=qRh!Xr>H!m~f| zPR@yu2V#UF8C1UW-+gSzr}=fUz4%?On{HyA=ME+Gy(1s?`&+O4H{FJr`=M>)|_ zP1-IewooV(cZ0alWOY-FJnj-<(wqQdM<{_62B8WhBRR@6;Z|7EDcy~{TCfJ(aKPjEg z_H1{`0AFNz0x3tfQ9%MBI3-xvzNoaXaX2DK{p{2GQzVtFlx_o^OLpbeca-(?_J}g~^R9UfPI3aKbi6-A)?U+3vf1UG$d$H!7)$|`IbZgGepqc(ji?J*6)qG-U!uyY?P2Bbr7&($UoUa{QH6I|L{~Md&cEHJ$@DYKRlJf4#^rh zy7vFYr%0wS@_r*${$G5`A43xQ?!e3cfwma(=n#Q*D*rFEg>H8VWV9gu)%j9>K(a%t z)W(3G|iE9@v1~4f4Hulz*B1GP|sA;~iFdEcg1Zo}!^}Bwt{i=dN6yM%quSO^x9K z1*LRg5aUf(Vj$b{r_U~6NIF!NuCFNI%{}A)V(UcS{7)aO61C8JKu(?WKOCHpK=CQ&GtoZX0yARs=pTR9?TAM9MhmAy;ZriZS zGvJ1*jv;*N4v`#WUL|O>b%KfF4W;1J3;~2_%5xP8g&XDM%CUX?a{sxz;5p=oWaT;G z6#YLC3t|hNgZkVS-Y#S<^bh0oGH==Tcs8vat@H!l4${-Lw;A5ySvOgC@>rjQKfwBK zLSgB%zD^87#ojdhZ7<%=cg1zq(*ErCSf{*k!{)C_J|U@HrnW!9t%|@*Jh?s3EMnWN z9AJ>S+wchFt*}SqL+8Ez-+3#M_`HDNm*AqB8mCFH`*ToXs=6QeqUlB}LYiAbeBi_z z%k|}Mf94%u;=yh3cAkm1DPP?94^^eNt7(o{%Vs=EdvJXb@)h@1rW6-CFm!n}74Q`S5z+tFJ;3#{X)Ef~E|~G(y_v zWE6EKx0UZ~D0yw*yD(2^%YF&-8R~q0K2tgGySel&2G$m4c63**)x_i)1w%G{j5bNt zHk0AA-V2rf%1>Lb*!~f$W@6;(XpEGGb4(Dex{B?1dYtAdNOdY-RbG1R^qtXCIyvaS z`BH7BoKeX98#s<4cX~qeZu5VwpwzL+YANH-B+r|+1%f%&Krn}|Do9=X+WbC2ftj&z zSpD%`{~C3ESAMx8t>v4K z7lpalai>!~;WN+8#cI4U(n-Db=blSX?e*A)` z|42+JpfAX9wsy|2?I&=bXRCqoL%={>RNi&FVQv3>>rzasq*BCK7Lik@hY7E;R$36D)=SawDJSxA`ztYxiQIK_lIe);8n?1-29J2estAn3-fz8C z@`*uG;x!_wBZsjU&Y4NP)}UE^!gJG`@WSWKjb(xE)ALMg&97DsHt7y7Q){w?r3T{6 z6&2BnO4`5(9^^#fl|HJG8$-5vB-6Pu&>ayMp_u0#!Dc!y6p~cReV_7;0E)oB;NOtFh>QFzSH}=32*91PFao$_Y>=|JozNP1Tz;=u;c}L z4-!e1g|~6)dCF%eT01RFUBO_gQi-&OH)ye+gyF#9&FV(&V7o-5i4#NEOoRZ}zcCIZ zt@-g_P+RbkyC(2gwYr<4I@{}t|E@ems-TP~fgb`Vb1j(?!(|!gDYw>EzZ-u!5oH-2 zXLEY{Y}hSclkt#I^jowef5ZZw?Ze2-?Z9#tN}j9%7#_2 z+MjCnGwbg=UO-50laVTjQCmG;Sd*`fRgi!F&Yp&RITMx=^d*FoqH>EpA}7`4U-uoR zvu8E`fw)Tch=h;K{m`51ase|`V?Z6BF!O*~7_MUrGf%7g2O~}8i zM}YWZiNZmXVoS?Ya4e1Ag#Sn>yJMvKUg$$RJN5=cqe+;c(tc*(Cs6v<5^K|U*d=-* zpAGIpZVNOl1-8Z+2s>A4ag6uGYiN>s>*+QvTON0tj&jC(&{#UeN6WO^haTu_Q!2iE zi8BC?b9M-6;zUV_tSiAq|HEzg8_!ar4*M6R0M-F2tyD4-by}F{5=g5mCilBQx>_^w zi@s3^mhr4mJ}dF*H?r;6*V+7mg0d!&M)US^_cnp2YV+H%qNKY|`9I~>kIOerWLShV zY8Bi57i^1v;bz}PsTF=#-$@wFOLLUpe5q5aOe(soMb20$*Hr8vryR+?R!chhc;TAr zhI2qIYtiRFkHqhX{EZ^)&4<)?koEE;zE3D(nN~(5$05ve`vBV>ACcii0bo#7XZq~ zCkS^Yim5<3Re&Z0ea|c%^HBP#U!?5AnZp>}E9f0S750bX>loKt>hHR>Rt{iXL9bqn z$*)~o$bRXX{Y37qBI9VQ_C1Ni_BhREFfabIZ5)J-kMtcbWA^!}W$W>orpH_b&V7AV z`tv4au|duA;YU|3B->-ts&x;r9bjFoDZReyfz*NJsw7q_n=Ou^@R?bZ9^dMYJjQ2QQ?CHE=i|ApZ2kuCy4Gk}I4ST| zY0HXJIdDQDDthYy+JIt^wN<7nsj?^I`LBrc>a%lkm-%Nk=ieREkSSlukuv9(W-6O= z2EbFt@jw&;&ho=&!$>Pj(Njmv@uB6DwRHVbqgz>uk%3(-AN%hs2mf@Q1Hi1GTLw^1 z+VPG^A<+DyCq7RTF}R*RY%-_cWb-EML9aNS0Dq3c>(#1qfFemPFfsTQUb~$vk2@Ci zj8WA7nrc$7_0O9EwU?I9E*ehMf;NSp=AX(W=~DN7V?7?>Qixci3VUx=n;m;^o!$x1 zO3?|TINBr4|stQWDsyQc&N>Zj!TK{?iS?Ibk)*)`W5ue{`M=5Z|vp#Pgf-nUWA z;Zd8^4cYEZA1?Fp#OI{({HaNX;h-nW>sOnZ(h3PX>tCz8D);s1DP=2&;+I?=0&l{N z)ES<%3y)eRT#jYNP8RF#p%EpYKEfemCsxvm{ON1e`=%t6452VbJ-!NjW%A}rnb-W6 z-u&|)@uBIil$@D_@thCQ*`Cn807eeJh&9c)^>%kQ#+i8=7ug7v5=ljWaV%774Y?If-$a(nG(`hd+x(o z#$GyfJW0K({YS!4u`N%mI-5U}(%jpa)9)>H!U;C+313b~Y}PnEPRG>)PJjPfYe0PESjgPV%x?t-jZ9uJ>KcS1(ZV8&_LWf@x)F z`gHogpCsP3Z@9f*w0phmLB00|M@WGlaL5&Ev<LOKs$_fZO4zowm z6hvN2goTm+K@EVm9c~kRNeu4|y{d~DUj{_7ER{!ZOV}2JS0G%*DG8pi@%U1hf}3`L};Sx-mx}YG{&H=Psj4# z9QWZAFAnB1XqiMtjT1J=yk(R2+N7tD`q+8T6DJUKztya(Dn#;D;fgQi9IfeoC44B9 z{vgefhi&rtb^q3C;Ac>3TRMj^n=>J+rZK_3S22m+yB4J>XC#a&aR_xALrZIwn0W97 z`XSI1Ghu~J6;Eh|l;W?;!tJ=;mtPlq&@>L%6U+skk>r;p}AXNugI97`ls!h#R$dMH^yC&c+c4p!bSx(dWY=yy-A5LKq zT!7e_o=KTM6@5{B2=IBe@8#pAl@}Lh(?EiO8L1tx;`ES-ei=<~_W4d|R5N|1z%4SK zW3M)1$0rj6^b5J(zrMAz8G9gjzx8IyB~1~KDIXW=77&Wq`CVuJFheXsP}FMoiDbE= ziq-#;pbH)1WB=T5!E=hC!xAe9{#`nwS$XVb3piAiDg!i%i0;1LIUpuYU}w*c{O_i$ zwb&iyUs`ED-+c?`YE4)mAgitDzWBb181r=JGknO+mLck-T%j!6A-7%A-F(UmJ$pQ& zs#0#|rwzQJ=X>h2@54@%vnn69J%Z1~)usebzw9k*KszPj#XJ9&y)IZxFQPBX{ZZ$A z%Pr6I?q7NRM;V`P3(lJ~`pkbU^PRcDJy~hOU;{v8k&i0(UZ-wz1333B$r^&a(LC7` zpXI-T%LBk;-fDa$x$n*`zj>jfd1v>f{XBXO&8)TGYf0lpg!kQ&#!clTEQ%#V1Vt1B z?OYK=2hxAOC8hM;-8cF_*<7}2&vayW zupE><wyzj}?$6TY5ITez<@OfMWMVth!QknxiOmM<^pUpHAeTT2B zM@F-7>?-Tx)GrOGcPlTR?c`@AgJP#Y!zHFth7I=Gy&ByU%9&__i58bm@%LQ!@ z^#&+gIwS8B^~iHX{6?xf-AB*D8B#C;6KKp1>w0)pj!YK5VC==!RLN@n7|^+-nzUvA z=nr5VN4G?|n{<=51o#W~7nvyguwMDp7U%$LofBQZPtu2H5~=!`6$P_3!%TjDt}uyM zqpd~h4b!bEC8Ft%y7&Knc3*@NQ$evYjC059)m?UKO4vH`@Jy=?_|=SuA)@-G4cRto zW;oLs{q-mFvCPU;nzpR36837hV9a8*Zs3(uI@v2EGA^dVI6L~A+|JJ-zmAGtE4lY)U=)h zS0_WE_Kv!i!92U?yq~zj zljO#12YyzLOLtm!dq#`8Ep|@|`?r2S6)CCEfG?@lnfxTG8wPr#^S25$>FZQa{fdcUzV>J=!^5=X#|qXiHg)e7>m)>`D|p!7hz|*i+wDZ@a*r zE7%YJlKgR+_xDHQQs*X06G6GFU&ySLG$+FBttBFz7!hs)b39PNdJOQdqE6(cQ-WT| zG8a7R1E`_0B@rHlbgn`$_cfZ;EqE4Cyob$_zH+~D|JtChPJuRn62pOQx9>Kp%u_Cy z{c?!_f@PBq6%_q0?GtNMmPxGEf_^vvt*!=q4i+wc+Lf{xX0k69FnMBmPm4c=)qSa0 zdXFvbyM0Z->*1f3b7+>YC+O$(WH`_1%N+Q@NV=FmK9+AM`l&qDS!RDHeYo76X!faD zopo3ieCgBGajTUnx;9D zX5W__%hkU$hjQvjdDNeNy}Gh=N8uW|+bU8^v-_vMtA#AYea`3J!2r!Khh^7tc# zvu+76w_mo=AG8+Lm<0`#s;XUA@1w%VMF9)@!yCD>hMncr7dB0GvLk@6j1rKA&Hqks z|FNJ57vrZ0TrHd;*NlBnw?JS{(~r%3aCLb8)|%=+`tDH!GoP7glyDTh?R=`i$K8O1 zFobf(J@pb*+J`5h*mCXd8^evRt;K16u+m)c^^614TzP1?=a){^apxdQ)6Elm3g#)` zG68q1{37jVr@k{OIM&3phw{$O0&30S4qIbtWIhh9+`|nxZ}CrJSFDXXUgiup z_^8^CW|LNYWJ2wDf@sdylY6wUo=R`?HWOWb5c0KRFy-_kXd-X|UFC*pSlwJvB{I=> z50DU|4SxxGFQW@9H2CbqpoJ<<1rX{*SCDe297r4!tLE^P;!U0vRq%1yb${hBoq+~X z1lK8{dv{*@T0c#2hHC@a+3|~`8+7{z##6vxO&csU!M7_FFr^qmJ?)Z6P;<8;Y_#6$ z+FU*|l3zK4U^xeNFP-&;nGenynf3VjLI5u-)}P-@rZ~JmCoeXsPWfle$(QxUDo3xr2Q8G@(D=)rl%Q;-y47p!3*8xsDdx!^Um7cDgpjucm_+g zACSfT@}J(?a@RabBwpRWhy(O966Qx1n+YR=Y7}GO;OaoScpsTcJ)jb@FavLzYn)ca>5(QGEB^ul6{BT1x z<*RNbP8vKbsu|t_jjHwMJ&hL&sY`)F17oCyNPoZM9mi5`kenfche=HXwVP>}+g@KmhB3WB+O_%V*Q+Dv6A<9_&q-C#v&42a+9-S3=i|gQw>n+n z;>dl*s4>EE#;Rx3NOSerE*3wvWq0qw&UQP(AIr{*4SWp39`-I>+w(b&fv#5WmDjh3 z3*-9|<`PPs(7JeMZGabIBd!fpX}-LoVb$i1zzKFKzNQI%;=!3r=iuG{;T{XA#uaoQ z?l4~R9lIAI+hCYY{D^tI7*)i%yIRc3jXMypV?JSx#vYA5aVb}U6;71|Dt&x=^mc7E z&!snBbHCvtfASOT&0e}>hUV{stt#a%g0nbA&tG-Ny1BRu*}+4Z6P8~|MiB_f4Dloc zdh#i((f_@N<1YWXAp<(oZV1{ryagB{EUQNVC141*H-`eaw~2S-4Qdt|;g=h`@NKT7 zI-le5f>Lh3t25P&fvet}JLa0Gy2^o6ah@bIU**@d;@<-O)ttNiX2w@{58+cLet-Ct z-hz;?5IMa2kZj+xhX#1KTY|WO#mJ{&{A3OsEaV#$U3VsaP z=1eZJ!=f`TAPsE}Vy5ysXw$$nl6Uht-ShV0jAbZ3=fjw#HHk`>iRh7&K%Gct zr7tPdJA#B3U$@)U1~*x0R}R|Pr{;$eo4Z^Gf;1K3`YWw3~Cnn-w{S+r}vH=lwy!H4-%S`h%BN4pE!Dog^G4FI0~pWl_Qw9t)4T zI)J+Xd<#c~vIxeVqo`KZ2o^!<+MU<(#~VsW)!-Q{~g1tv>$?2PI?Brw@)J-{D$y~e3I&EGycsG4&P($SO% zJ`;RXbMvrKFAv^3&Ns}mt4UkC7o7xR=uNwy%4DMM99}|L#9@YKh~*oGL&(F1M?B5B zWymd%c?P(wvPR3=s#S4_aCvlJ8?smBXb4CibroQWxa~KQV9@Nd36*0ytTZkA9`@Dk zK}*6D`B^W}?*fw6Pjm0#ML3k{R`im1;$`;;QlZpL$Ysw^q4VU=CFQOVI0sS|Bwph_ zDC?)$9a_&}_gLGqYxvTxTMZqq6|Q}dZo<&V%=u6Os|@*0z7RKH>8$YK&h0U4I0|Tg zY{?quW%%3V7_uocDeyc~*t&3_2uSmrI=_793G<>sjN^{uxP;cz&;hQg-wj^6=@y}~ zDHvU}<4~p@O0FHZ%+alSZYWpC=a(mkGCAz~t}_{Qpt~VG=ZV`jFT@2~|5a?$)aDgR z1NXg6;53D49BKdeVU1Py7411>e*T&-^EAZ=iQmC!&gh865t z>byVsAbv?-(EyY+R)-~*+v&e-bX6x!N8hnbWQ zq`7rH9qgg4ZKfjORMZJ+D92hMR%JzTsv5<`mC0NH`6c9l56hMGE?)g55=5THPEfe5-N7xfYD(8? zV1nviheVx~LG;AFz2y`hJvEv;e4w3@4Vl8*v)w-~DsJz$gleROn;QJ~mdVaniy(9B zNHAz6-dtU|BS^<@NVOa4W!TgAV^8j3*2PY}c*8N6Lc#du?Z|ubsc14KS*a2e|`9g zxFV_Li#v~xzcnY|x|qR@T^SwJ*u>HMU3bsruaL>bUK&)m@Of(L>G2m#bg($voI%>A32%M5|HN~;yeY<*7Oi*ncJ%qb z-*vtZTj7r94!TF8^~C+b!!uwUIKd97IrKz>FzkT6g@|kfi|PyeeiaF62?425Q4ndBk{FeeR_X5U zZbn)`KtfWwVd&107Lbtcp}U40hKaNNKhJ%i7w2v61T z_FV)AbL{K)nW7YuNaJ4_9#5HeoE99p+FV`{l&Y5xA~4H-$6+)o;+-eCU&vW-NA1U~ zBG@MEqB7lx(X9)nNw13@j6=3Z+4N5su-iNtLCh^WUE&4;Pw*t;LkAU$gg`5Z6U$HW6V(gWJigS3xJrBuhS%bxh(WH3 z&@(=MFR`png8iI`1p+RCs=v`@h~7uEB)hTjx)vswgA7r?lP2AZ7uxM49D2PJlVFEI z+Q6P5?TQW*qX^Fb?7eg07e_@ZOa%-4?M(vqH{Jktdi5{w0Imt<24RCeOfY7@0GpAX zE#A|Wx_Y1(Z@yw6@y9?x+W2mRjQs=d-%(oPe;?al=T7loX4M*Zxw#onDSRusk2Jz@ zwZ2>Dv5C0EYrDy+T-~G!Br^T0`sj30uOUL$qqGLwn297=M$4VA=klwSF65pkPZi_w zyq*r9)|(0U6npi#(BY(C?klV~s{`RXQzc(zpM#w)yZ_Cc$vT;)k+Pent+riD~yOIACb1(iFrXpl{z%c7mB+0(~QNN2V228mK z0W4m|Te7SxG&f64|_wzydmZ%Kd=b?9i@oKza zh}{NvhXDs?jq5-@IT+A~z>lEVlX+V8Po_l?mm^kj`5rMtGz%I;h9oCdG~9H1>ZAm! zy_xmC)4fv`Gy0=iWUZH=%#Sz?)*UIrH<~EubIG6Nu^I*gL>3?yn_7{uCamzXclU0b zaZ z_yg_ab_RQklu(;D|04A9^atP*$Is&WKCS^isAge3K_geKc$m}nFtxoCtmgk7%VcUmU;kYJS8F-5R9tCrn*-6 zE&oc7@-5taEPe$PXYkU$sTQ>B2q;)b;Q*O!2GegYqay2Mjzk0Ci%GRFQ!Ge^hP?7} zEH`f60N0eE<5Pl*Q~s85iW!|4(7e9vKjjWB|LVMD98Q*WPoMxFrszSid?=n}@t0+~ z`=C%UMwmDFQ$_31Ylau*cc<};_v%Uj@xF*RdMZ@j#94Z9de}>uenIbu3-ONbQjz=C zp*qrppbyIIujx61^#x=$?=x8cUb$nN-~3pYTM1~r9{^h8S!O|x*`-EOa!*OfxPNvM zO)?+q@MLn*6$0&7<|ntOqBK9mJ^oFlrfwJ%6iz0Y{k)u&`xE{H)5t+C{;}_!MCz65 zZ)GAM$|-&HAs}RYf&5%r=lg;Ffk@Y)NkLX0N5_faw>CLAfyU4O{$6-wR(g;`%mOte zy=RJ}Z*_Fp=x&)7RLIMvI%CU+QLX816ysQvhDT4@kG(IQpkH{4lh3N;WMgH_PdYr$ zM-KV;;PZ={G94O2n%&ApZRyoDoNu?aQwHs-p8s-5UR^SSzLa>}?rL+}QPLupK7mc1 z=Et+>5zYc29wh(8gYEkMUsIFkmA~F70MSXnGLzB@JaFx!{h?)Syb5%0%X-unp;XNe zw6h~u3y&v5guCp z5mTTfVeYlxGGj`7Dp8!zV^@eVs-IgC)yBG=RGXn#%qp-vU-xNHv%k%GU3({x5Qp7{ z`MiD81o(h-^$^o&%j&Z`LcY@nReT5f9v(Edy(;-i%h2QLOsuA0#%s?|PUMrPe|g)_ zKQ*1?Mx|UPWMOCx{exKV@UC)jA%>pF-pv&A*uziYP^Bm}{i0c|tbd!7_U+4h5uU>0 zHoSzun$Lpo`*?#ql-OVQ%e<2};eA$0YODRSSuVIb`9utgRBGORWa%rF5kdKMB^Zt- ztoXHncIP&%Vc46jU>i33`BR+=dCTkmQOjY&AGuh`-@Kh&`)ZsT`moh{f0MP|hfm_~ zmaKl}OrRRcH!5tme=HDHn=BLhHIF(w%38#D&^+|z9C*&Cz3-vpD!TV^SIXV0yc?!ej99w+^P{AKmd zfV1av^CRXjuA2gTFiKw#U4Yp}TCS#P3jU{h6>=h_)Njs=t&uXdSI zR5`O_II#h^^{jIcVh;-IXINc4!Ggr8#TkVS=6}#ZnN%T*r&-vIq7y)8E%o_B7kGek zNUoNlfc+;Pt=|uQ&kt^|!yhq6gp5ODn)Hxd|!2^6w_VQLRpDP%*Z|oxZoQU7`oDGB1x)7dQ2l0V+bJkPnP&Qo1Vc0N zVb*y9!E*@4C&PNKAhFt{If+bX$3{umsXG7nh5PNc?&lQhzXtDWMysMAdyt(64V60#@$@+BPF>x|MzU(R=zf{CVn54p z8GA>EHC1wd&_!K(%c>>QPJ%Wi%0rKWE#f)Hd)@ps2ZhN||CB&1_ObVx0$M|l#V!x1 zJ&@(GdxI-$eJvkrgysB${@#ZNNfgH3)q=uq2X1YLay9l@8ZTAH#Tp4cunhd>%K84| z#B&=+Jd79B?)@>GGejOz1386(-r-)h;;)NAz1uFPt!I6<4IU)1jy~8vVCukm^?OOe zJH5a%xaxl9?qk0+ww&>Kjx)I<2LzyTtnxmZr}-)=;-K3 zbo(bMpd{eIoLjag`$2WhQsMX;6KS%(KW9tS*W$_;-}{%dZj=>s|Ga$+TGOi8VsM<; z!KbuNzhT%ei}7JMOo)ftD9yy^_r5&QUP}|(tf!jZ{UPXCZY@H3C|X=p!T~!uq1t?v z&J2n9))8#c>N#(us=>1EciM^{(eWQ>1n zKa{fvZuj-RY_Z(8#1-mIogY`52Bg)M2Gu+VWAQyc%z%VFYJi_*d~`HRvfD4|s}wOT z!paHhLT-p=o?a#ZJ4&xl=&Ob|;A_bXuzppV4|gVdnr`#=w&$73a1$azK=QB%2ghN(nrC1@v02!UGR@c61;rwG_?tVqZ>9Wd}`Q6d=(QX@zlGX*{@bvY|7m;<~?xK09jXcDB z!5p%EHh_B!|Gh5-9>)rwR2;SKQuA=%WR4A@zQw{`_azeTBi&YhHCT2=l8(_-F3a{_ ztj*;3+~`)2@wkf}E77E{p#_xpt*#bev)ty z?o~pnp@?~+yz!Nluknkc?RM-Wu1B^6bA1M~$|6C%699xb25^JBUZyj{Rk(KK8mXsY zOCf(69rV-8&$^l!m|9Ux*n}#$-FYKUj<)oN#@P$5IqZH#`^fMQ1j1OWBL%DH*i3Le z9G%_VG|Mv|{uqT|`2;<-(T1~;PL-CRWQCp;g1`mq=X`yFZ$0$gx2JDkfP8;Hs_DPq zNCg54zoXsVK;5T7`ae`Ld^O537$FyQ|HA?LKNM?>)389x=d9$Y_psB!GJT>|K<0x? zEXa+7Gooba_9d{eao_Af?+v|6-T&FOA1&gzsNJuaq3B6$NhIx)&oxQEEmJsyGpNs+ zPdM+tj5!;?vTL*B60lh)P_OU;-{4nR-7KSPC9vvPatzSdPey7LKowU1EHw6u6+Cex zs=doA2b+ixFIrk8A4+LKAABoUGEhf%s}9nl&h0)H8uc#&v0ib++Z{UeXKg@!oPoVCy@7iz&?sC1 z)(Q3Q6m|^5?TSI223a&0z+KnYf#|4pu%ouFc7uI$`hJImr+tp)aN6^&ugrpk#Yn}d zNI=tgI?1Rzs#P)oRh$yJse!heuhY2=r}9Ak(UNp^Z;}L!H+2jJ1oW?ox66|IzAHQh z3=+{B94g@3fc#vEZKV?jPdMDyj?6Ws_u^o#_M1cQrDB^d{Y`p}36qTBN8NFlz%+Q7 zY9siBz%#~%CFWE-6@drljBPnMn6$umdaAz3tw;2ypjUbbp7sDh>V$PT5B;7bn7HH-Khd{*Y>M|kh(lV}^> zEc9qEZOxDBs8}%g92)^QsrM4{qr2RL+qN&j3-u(e;r4!WNb}3+Q$M|C zl|oyqJ;V_;>Vns|7!dO_c8gO5Klx&f|`#lrj@i6{;>Op*7KeDCxVv6)AWGD91Ki z@Gg+kgwtKWA8d_u~fdca4 zPLd54Pti`5?U%v0Hnc(?pr)5XzV!W9?liP>rI)af)ZDrCxSHr&;5vEXL`ez;@lpF% zYZ-4+nxg(^J;#;@Bd>4l)oS8rAe4(HS6MhT{badb@+OaN)jd}4owp3ap4{B}Rky6& z3iBW?uj-uOnfo#=SkIwh=dILyqF4o_(Z$|Wb;r>6xyB!n%kF2&&X+ox6pwP*DlzT8 z7r`?|e)nxBiwDLvEA(&Uu1C2}{!FO81MHJm$D}C3jwF0VWY)d0) zIc9FhNZfj{p`Z_O+=w+^K=4!gwgRq1@M_8jh};%sV|mZ@kXfpz<4>QFglmAbn0NI}3>j#Y;K89Fut5S4C~U0S~$` z>64p9oOh>gq(k42rPe0J6E4T(6%RXHC9Z{M(m}oN)H@DYG?0qW&{6$1Y*X%A;5-=J z)XLA8xXhV);)MP)atE2p5;@_$;#c8J#tRs0RorSjH5bpAbs`?_s=igOz6++dRMsO= zH4?i|H#!tJ5=++Nfm5faQ&9NAWTA_xEzDiqFYKa5D^Z+%XB#u2 z!TT6FLj9b+-@7a;HIz&B^BA=1xE7b%Fi%%>S%ln2#dx4WLAc|oM!s)#SrIuRmQt~) zBcE>EC|{@(A2i%J@}po*>d&!CSwbugwypP*URrQIc;$U>Wl3iGA!4+c3yy8~JH7?@ zT)Uy=8M=)Q^gl}rosBY|8XsWsvYKip)Kz|Q-xhYpcm zHaoV|6@KSR3KkfVch?P<^&Z$Qw&4d}L11C~0H}aIo3mQ|6+$6xPrSm`iN0+z&WQ;| zUgXF(SIK_r6yduYHTvCc2+3%T)z@Zov(O3WN07JRW%3 z7N!x;OYHfIb+Y6Q`x_fToY21}J+SwvM)Y0p`E~l`lSVHoeTJDH%EN~&xU;&us`()l zX&(YZyxio#*!xO>eyr=z{Cm^yb9;Q=YWs)()C<=*kw4q+Voc>4dJ+0n>$_fGLOt@o z-iAe*c}^!rz492#2ighP4M;WEUKUe%Y#6Y5->~Xa9r1SYHv#K)3eJXBdiOB1*~gd+L?4Q9|FY+&QS|+Z2;mGNk_`w5|M>VWfEM(W%<87%+2p z)}~1E+qeDKcGKJ)OsLuQ*zyG2g&5xc&BN(Nvi&HMr3_WHWod;jFEmbF?9bKF6q92U zLUy(}wuDb>J~L^3Y4OG-!}+LLYN_k>huqX?5i7p(L7)JNV7={bBa$pNa`SPtxbk3_ z;0vuJi@P*z`Xkk3oo1!~4RQ1T4Dr2j<}@(<^!w-3+XO-0iqsSd3L|@@Px<4L5+-d9 z@Ova{JOMJY^ZO&Il+zuv*v`Llm|&Ccg94P16+V5T!E3MZfXgL%02H|cfPUdxMmKy) z3}6b)@~-}=?-z4LIAS6eKvEKq3?#`MPG0M!O+_O#Ft{o0{*Wm6RjNyyDPg*=%36+; z3Bw;J$S=EVkvi*?d=tst8BdElqGF08vubC=iZ!t6kF!7#0rWy-AZQ@;iwd>~GdRzA z0eM9NhxF7+_DFs)b3VKQb##*e0yZJ9z2%Zw33$si@kl!i2}rlN`(gLJwC9i$54Jo1IRX4hy&)IJOwv@D67Rl0=bgZ4tnEyl1x(Sj5}&Dm3A}bIalcqm4cK7K>`N+Q&uxGuQDp%pn&{cJW>Tj;-VIaiTHMdA zXV_7+_r_V8CVrn$=#GPpB+~6=5+#$>#z}>_yV_6e?}bFk)wnw5e*)P7e0T7K%P_!W{V)NtDH#NQ-O#aXukxu_%Wp_uIB7glJ}s z-1;kjiYINJeaajk6BdvC(N2No@QC?8zo>Ajik0hl7$EftL3+&5GJ5wX3cL_ume~+i zt!l5BMSt@#4b69Lv zYfUuC@8wzV{O|#gp>JA{OxG-L_q(bg)pR$+TD%o=Vb%A+j7pxV8Zu1m0)}{}zKd(! zLu;1-{iw6~cfHpa@UVhd8jas)iP0I$>g z{+V%R#8p*FpMel838;=9AgG_v1JTW#SXAKpjZ!3x6B}=|BOqt2G$$fLm})^MLpQ=d zpYR~Mh{bD>3fK)tPf`~L|Eb@f3Nip7=5PuYlBu0AyL|De1#6J+NvCF2V$Wpckb>YV z*SW~^ggW4TLMUwTI;CiHMqjZNKTFPNHpD(<2w#xL)fY z4zS(3Sq zwn67KM;$+E&RkpLQQLhY7YTNB1Zv8nxMgoL&%vdI2E%(|W%%o$4#QFRwH!2%NImH& z#83+?t(lK)?20>K(eD6pzc!^f2UKpdjH?cOepk+n-nmmD?fScy1@WkdddbQY^4}DQzuwmJKd>U9CB|^Qsq43+atmOGHaM&s&Wnv({pfQXPw?vjd zJAnIyQv?i!3tR6E+67=Q+M=x{NjSg z0(zVn_Wg%$H1;6NhW7WZ*t-10zOww^fxWonIA-K;WO~LT3oKi}X%jD^^vXE$or@OJi$~CYHmQAG%86hUqfS5;F_b)dfgPuOJO2B;r zGp_P7Q1)QolzKG1&2Tz5i5s(YBw0N$y`5adnhH!aS!c9+HVwzmI1s<9j7pf@${v%@ z2C39M4>$gI$pg6Jr~wm{%21PZFcafc^Q zOT&4*=r#oiBhPXP5hXy5MC&VdTm1cJ5e?oj7%fxj34`vklUp;EJ2zk3IY`>_r^2Ih z9dGFmmyKWZ!F6%k9}B2L%-7Ww7}_NL6lx&og%77-1REk=iBSM3wJ!MCxnEoK1gD6l zkM&rSTYH-N%JjSaPX*DC87ozJZ1TUTof9P}fJv&K)BpE{(0^aZ$0q-KBE~^V&oR$> zO7(jl&WZe>CafIItP!}$njFO$2QPTO?bHu^JU$61%wX`=6cxGb2Z}jW^nO|T9HIn) ziAxo`jgsDjaANb3QA>}a!JU+Ct9R4DRhEGYBUWzJeaHtd3XuEu@oP^1Cfh<}dLQV3 zV3DdTu7Bf{D2ZGEn|RVN-n;kiqADVlFC|idQPopFDyb|yB8vETiMjRN6NjP;&IgZY z=%j1q##M!0^qJPKaL&O+BB~?LXz`)K#6fBUPjF{RZ}euBfQK9W{OQ6hTW{9Cd0wzH zxRoGt9BCFDQXLsZdp92uQT`}=RsDqx`XcH5x>Fh?#W`-vh#IV+z|zb50{1TQHcL>@ z&d9U1rUZiJg4T>(?-!pRP`#(Tm)m*wOqWfxkUvqq98Zqb1wZk}kIwj~iYp}?SsSsM z2;*N`!q4f;@>(h)u*gTG(+yM$S?3W3B6FZ6(QA+_(RtJ)PWj%CuL7HE&dG0`jRiS2 z%AWzjNLY(KO^KGoasVTjj2_i{I1Cv_a}48lGRrft*A+qEd(%|nhdK{lag^%R(lI;# zx;<8;3bOv2O913)i3(M-2-VnC!>+*Il!gHpg8IT~@WPUNfwwtS*@oOWHg>&cS5IOA zXt`M8a`uiP;EtEfk=-VmY8T4$)^_(EhMY+#)Cq=}ez;y+&c;C(qw@?Vi8|X5)gK>~ zj6XQWOkIcL#p7}Ux_mMkD7rG=cSuK^LlU@Lmz8edNd~s*RpGbO*v~a)Z~rDtSap`QiIikBLw8ot^sVADLx-mNDI-Y#WeQoH7pG^CyNbHMx~MaS|Dc&sOL312Pd zzD}IVeq9+XqrL59#S_6NsY^CQSK+F$O&2m^Ai1& zUXQoQ`@*&Q{OTG-6y5)=4&0aSZ!I$TH*Q{4)>w@etTW+4ohI-s;lRmM%9u8pm|RZu zb>LmBmaZ;|-$65x`;xDn^+E#+wmz&tF}Z7FAYm0q2!{#7nWNoSMoa1!EnhnfUaAFL z&AX}Yj5m|k9e%!W2)Qtjy};1!i#^!CVW0MDDJvsm@h7<6kY{}UR<|0_cyqaw6By$A z+fi52VNX2;P?uqE$CB>}f6nmSy|dKn5s{=<*K?uZ_Kb%o1aM{lwZWONin&_0((|W3 z^a@E4OsVdo?8fyH4YpzdI%b6Bbp{%{+b zGe%~K%j87V0u=80EKknN+hHZN%s~F}Y7{uAvXDE;QD+yam*>cNaC$~J=5WmZp&;_y zt(1pVo2L{Uau*`%L)CV5DtxkPXVhv-Bg%)JF4ZCt1O26LIh^;od{7$`Awvgn(`?YVEE>Y zxC`x>f(CHUFJXr5o}n}-5M@8B8}}=R=~q<`dmq%iVByj#57l#OzK=cWS2P*<+5Bbh z)g|1ef7uz0z^u-iL5P*pggSM1bkkw*%1N6+-Ck&p;KK$r3JAFw)p?qA1|0$>QNb~kDA%n)gl%S9hiCM-R`4hs0 zXH6@@urOh{SkL5P;U$KipK;%Q%~yb>y?#3WzHANeQP9BNNwSWM#DyQ@${UQ z2r~V!KGqX0(VTMRjr7atX+DEHapJXjNK6uY70oas z1D@*&lX;rJm2(<7G|89yf7TNIGxwiOIB~y4;jY?oO6vXc&~05_L{Ic`12F{ z5(=jLB}jQ4c)QILNAFMM<}eTG5;VwpOPc1)phN4{Cn-U??7hL&qtSt@UvA)Kev!|T zI0YT75y7rLa}rX0xcg*iKif{kZjjphWGyxh&RS^l^U>>Fr!ZGa)=7%esdvpuj`39( zg2-kOE;g3hLf)_lKGaqGd4>Wx7HlIp z-Fipzmy$TL{jmFquU%!REY>TBTg-1yT{%OKx!9^ZN+Z;K(#ua!X3zlgtkOk?tEG=T zbTz2aZi0Qm88R#8s827N@t$XWWuuCIo@cwgm&Iwt33yAtBx7(6U+0<*oOu6<(EH^P zr8D5$nEqnF1Q)S_Gd&@xgz+;DA+B2;!A1dY$_GCLX1--aM>xtd=|;q`tk%yMh9&Xn zx=ww;BKos_0hJQLFa(- zKB%LaF8>l}8Gox=JSpxjo~iA8*CGYaXA>IBZmGJ#x~%4ez*qDw9O)nCKEAOUGKbWB zPLa6mK+xPIfI z-(&LSzVK%t{S-pPhrX*>E)Cs(In5W`W4`0EL{o7TDO(!s^}L#FFHc3}3Zl5$K`MC~ zoWZ@V3)P~XDb*tE$N1P~i{&iF#yRxm%be_{!@JO;Tqf7?8tA)D-ARJkI_YU+z*&s` z_dEWA9>n6IUT*SMhPX-{7;OwrO{+MJ^Y1S503*YHUGAiP6j@Lkl*kK1v#vClLJ8ji+^W4guC4i_4&Bwq(yOmXjYU@rNAQ{9m6E~a%9 zaAz{o&t@@Y>}1zk1`wDn2QuxWSp7f8cC394ioNRF-L0;i@bM()^tp_!*OQjBXm3-1){j;KWl$=;NxeTsTEvgALZjC`_lOS|4zu*U3AEP1+?NG%!!dbl#dfXS_|k?iF650hLhKf-Y7muYBhe%r zMlc7H6HE_00e6YqO!^T6Yp1Y{dF@LVZagP7Vq+xYC+!u^X#~>|1POC}fkkA%mv_N_ z(y?8dOM8SKU)Djq_N1*C)1j`9uw&YjT|`6$ZgsnU8%5p$vod)&R8D_7b)F2%S=5Go9UZ`}xjb)x)#?$LotaF|+im3*kmT=@D%~3)7a!kK)fXDUx3~h18zk`3M zlTIN;K1?<`O&hLPA$xERBu+ra%NT{u=o;$lM$niU;h1Q2pt zdvJy`oLP)Sq4OVsep*1!;@)IuefK8bTA1@Yr4K+k*#_0Wdn=Azi?GUTdw# z^Yxo)U4R-T$yBKYebfDGcwVgd;0x=V#$lm_rb`-UUc&A$?^)Mm zS8K3DvQD|Q$?P86{8G`vRv4pf#<1mL18}t?CJ=)J<%Se5ze+}1EU6jr> zk(l6kX+LrZlD;U2oX_(*W*M&kbcQ=c?*48T{iAzR^C3i!vR zuf3~>=G^s!^XoT_OASjgPgn9t`E4hkg*QLhEx;&2vA6FKuAHHbEYiE4?(`Js^ZxFC zvO2t?jCgF#PFK|XkF)%bt7NCih@yR4@xNT9;J7{&&wtcuK0sLt?v7T!p-OmU^&eGA zHv*8VF_%!fQCd>9|4W(f$#50Fr`q_!`48ok0#ME$nv{Ewkw`9eP8qU_#{bKmI^pGt z@XQwK8SHqyCHiJVJ3IaB*`mKqmmAXYlY4P|)o^CC32tKEd4GpxjwtYo3T8ErD|HYN zs_696bpr28Xg7RmSe@$Bm490`6EtjmW!7k{90la~y~ql$3UePfumX5zv`w9xz(7Gt z$IAYF=j|2Bnon!*az#RfWumg(F7zx?dJ6sro%Q|uA1eC)qO%24Apkln^}p!s-jC=1 zpH9(n29y0Sy<4hPn*CVjJKH~o^A7m~|2G=C659E9U-bNMTn$V9|9Dl_PR!K;$k2P0 zKn#b!7_zCwzjoBx_1$KwINs1Dtgb0>kZbHq^%t^bwW~Z-2NDkeO-ng&s2P6Ko-ayV z0R-(;fSzYpzC7q%nWkPBAZ3$Hf26Wl{8no5kq=-yUj>}0AU$Rr8xE7>pte6stNb@f zigm;Klzv5<@~ziLI5ocMz!2sESg|#5-S<1+>gL}){eQ1J$Z&v`GkD{F?*|QaLK{P> zHcf2x?TrRlaCPNhj|~{WVLeA~-WFDKeYHAJ=*q#?5}nzsru*raQ#0Wyf<`3e3VeOA z)L1zY5$)`(S(GDznVe|xex|pPOHujAe0QuPAX{pG(pdmQXmow~5+Vwlw##5tK@FXS znL`lWzpPwQK(6#WZ@3M&%G-JLakgFMcSizae=th9>@4GB3!A)`*pgY#ralgMefGDx zU%7huAFG*Xo@)7X&>h!|vn*G%3c7md^zW)fq_wuXTP3ktRD9Avf`f&U7|DWL#6v*evv=)osQFTP66YZHPt`&>gZ{A3ovLk6dY+y>Z8)pC* zx&c96?e@0eD$D_gHlJ_e+^aq)SmpKZlZr;i+Hf`81cE&rc7v1xt8X7uMdSN2zUg>* z{yQ&rtpX;ucEK4W+7zN)yES}o1bi~x%oXvlvCCP3LXGe*J-4muV!{42Y-#Ukg*r$w zOKSNYcfi#$lWa7=fczz4y5AE^Pyxdd&XzeDb=cT~2Z)r@UTww_B#addC3n)I$6i)W z*^s;=S|iS13?gC;1--^D)`#qRmqG)pnFex&Qlwlpi3NxiwDlS1jmG35n-u`ax#MEO zd!4oG1+N6^f&!-t>u4KWWwu#yYs?HDqe{f2Z=WN)qIm09cSyy|&^f;dPmF+4?pdpy z+E>>zusSHo&p8cMnbAD0>{{9BGq^SwRL6vX+0gBvd@$fvn}5e97Ly&m_BiBh!qi>{m_eGQ{Ym{=Fmj*Qz1|PYtdE zm`QX=?$jOYfG8vyCGs?R_3kuMc+)!{1v3-uG@0EIxkn%AE~Ck9aHlZ?!Mmb`7r9rt zP{)Y2MGB#tS<)_`x*tFPjm5-*lLHu5;(7Nh}X^Z$kuee0c-{S1)DA+k<`vu+;+=BfL ze8CJJ4oG63{a_S!qcExe1PcGzwov? z5UVn1JiK*P7sPAOa`zwQ=^gYqECvbtzT7pNL}T$(EdI~gYh%xKY*BLpAt zm#%wpKP1li?&-^lmg1Q_l~gp;)eYw+m~B0lMBd(tlai16nJn*MT8L{5LIM z-ZS9r1iQZmLEhz7@BG1dJsL{CwIT*}j}V08Y$tgEX3~+o>17qd!@SjQ=Sd3KPBeLR z0+!Vtr2wW@%HjuQwpf;)>7p9;Kf^qvJeoeg(E+N22?}9~QE-2Zy7Q=!BeB>@D-;?v zd#}+OtB?{NwN-NbCxQ=bfUijZx0If^0sQ>C^aiURYlJK1n`ZUjlGL@dn<{UcC;CQ1 z_`o{$8(T?R?D^QNwX7?OO?Q&>bB1^9;7#He0#=Tay*Q938oZMovI1!0d&~rmWxsXq zCKql(Z+T)UUo-6Ae4A{%6+%c(vA6%6_p`?}Y2b|>@+=G6Gy6!2u-gdd+wQzF@vX_Y zR}AV(2C(Fooh>B`fQ7Two4oMoW||4LWWD+&lFQiuO6x@i7x8;PR+iRUS6`tE4^B6^ z@`)wMTl~Kx#5dohw_xB_7;6XSQ-pqYP!?}eC&TQ>6WeJhaa1z*DziZZpu#|}BC;wy zB*oyDolPx9L+v6>EUlaR%>qv)mVbBx=DPX(>@M@*ce&tl_PD)Te2r|#@0CZ+EWFw! zsb+mKVSv|rFN$u$$ΠS+t^UNZ>-Ph7i@tI}r4H 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 diff --git a/docs/learning-resources.md b/docs/learning-resources.md deleted file mode 100644 index 65e41fa9b..000000000 --- a/docs/learning-resources.md +++ /dev/null @@ -1,26 +0,0 @@ -

- -

- -## Learning resources - -### AWS -- [Getting started with AWS](https://aws.amazon.com/getting-started/) - -### Kubernetes -- [Kubernetes Basics](https://kubernetes.io/docs/tutorials/kubernetes-basics/) -- [Kubernetes Training and Certification](https://kubernetes.io/training/) - -### Terraform -- [Getting started with Terraform in AWS](https://learn.hashicorp.com/collections/terraform/aws-get-started) - -### Golang -- [A Tour of Go](https://tour.golang.org) - -### Node.js -- [Getting started with Node.js](https://nodejs.org/en/docs/guides/getting-started-guide/) -- [Getting started with Express](https://expressjs.com/en/starter/installing.html) -- [Getting started with Apollo GraphQL](https://www.apollographql.com/docs/apollo-server/getting-started/) - -### React -- [Getting started with React](https://reactjs.org/docs/getting-started.html) diff --git a/docs/module-definition.md b/docs/module-definition.md deleted file mode 100644 index dec427286..000000000 --- a/docs/module-definition.md +++ /dev/null @@ -1,90 +0,0 @@ -## Module Definition: `zero-module.yml` -This file is the definition of a Zero module. It contains a list of all the required parameters to be able to prompt a user for choices during `zero init`, information about how to template the contents of the module during `zero create`, and the information needed for the module to run (`zero apply`). -It also declares the module's dependencies to determine the order of execution in relation to other modules. - -| Parameters | type | Description | -|---------------|--------------------|--------------------------------------------------| -| `name` | string | Name of module | -| `description` | string | Description of the module | -| `template` | template | default settings for templating out the module | -| `author` | string | Author of the module | -| `icon` | string | Path to logo image | -| `parameters` | list(Parameter) | Parameters to prompt users | -| `commands` | Commands | Commands to use instead of makefile defaults | -| `zeroVersion` | string([go-semver])| Zero versions its compatible with | - - -### Commands -Commands are the lifecycle of `zero apply`, it will run all module's `check phase`, then once satisfied run in sequence `apply phase` then if successful run `summary phase`. -| Parameters | Type | Default | Description | -|------------|--------|----------------|--------------------------------------------------------------------------| -| `check` | string | `make check` | Command to check module requirements. check is satisfied if exit code is 0 eg: `sh check-token.sh`, `zero apply` will check all modules before executing | -| `apply` | string | `make` | Command to execute the project provisioning. | -| `summary` | string | `make summary` | Command to summarize to users the module's output and next steps. | -### Template -| Parameters | Type | Description | -|--------------|---------|-----------------------------------------------------------------------| -| `strictMode` | boolean | whether strict mode is enabled | -| `delimiters` | tuple | A tuple of open delimiter and ending delimiter eg: `<%` and `%>` | -| `inputDir` | string | Folder to template from the module, becomes the module root for users | -| `outputDir` | string | local directory name for the module, gets commited to version control | - -### Condition(module) -Module conditions are considered during template phase (`zero create`), based on parameters supplied from project-definition, -modules can decide to have specific files ignored from the user's module. For example if user picks `userAuth: no`, we can ignore the auth resources via templating. - -| Parameters | Type | Description | -|--------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -| `action` | enum(string) | type of condition, currently supports [`ignoreFile`] | -| `matchField` | string | Allows you to condition prompt based on another parameter's value | -| `WhenValue` | string | Matches for this value to satisfy the condition | -| `data` | list(string) | Supply extra data for condition to run `ignoreFile`: provide list of paths (file or directory path) to omit from module when condition is satisfied | - -### Parameter: -Parameter defines the prompt during zero-init. -There are multiple ways of obtaining the value for each parameter. -Parameters may have `Conditions` and must be fulfilled when supplied, otherwise it skips the field entirely. - -The precedence for different types of parameter prompts are as follow. -1. Execute -2. type: specific ways of obtaining values (in AWS credential case it will set 2 values to the map) -3. value: directly assigns a value to a parameter -4. prompt: requires users to select an option OR input a string -Note: Default is supplied as the starting point of the user's manual input (Not when value passed in is empty) - -| Parameters | Type | Description | -|-----------------------|-----------------|---------------------------------------------------------------------------------------------------------------------------| -| `field` | string | key to store result for project definition | -| `label` | string | displayed name for the prompt | -| `options` | map | A map of `value: display name` pairs for users to pick from | -| `default` | string | Defaults to this value during prompt | -| `value` | string | Skips prompt entirely when set | -| `info` | string | Displays during prompt as extra information guiding user's input | -| `fieldValidation` | Validation | Validations for the prompt value | -| `type` | enum(string) | Built in custom prompts: currently supports [`AWSProfilePicker`] | -| `execute` | string | executes commands and takes stdout as prompt result | -| `omitFromProjectFile` | bool | Field is skipped from adding to project definition | -| `conditions` | list(Condition) | Conditions for prompt to run, if supplied all conditions must pass | -| `envVarName` | string | During `zero apply` parameters are available as env-vars, defaults to field name but can be overwritten with `envVarName` | - -### Condition(paramters) -Parameters conditions are considered while running user prompts, prompts are -executed in order of the yml, and will be skipped if conditions are not satisfied. -For example if a user decide to not use circleCI, condition can be used to skip the circleCI_api_key prompt. - -| Parameters | Type | Description | -|--------------|--------------|-------------------------------------------------------------------| -| `action` | enum(string) | type of condition, currently supports [`KeyMatchCondition`] | -| `matchField` | string | Allows you to condition prompt based on another parameter's value | -| `WhenValue` | string | Matches for this value to satisfy the condition | -| `data` | list(string) | Supply extra data for condition to run | - -### Validation - -| Parameters | type | Description | -|----------------|--------------|-------------------------------------| -| `type` | enum(string) | Currently supports [`regex`] | -| `value` | string | Regular expression string | -| `errorMessage` | string | Error message when validation fails | - -[go-semver]: https://github.com/hashicorp/go-version/blob/master/README.md \ No newline at end of file diff --git a/docs/project-definition.md b/docs/project-definition.md deleted file mode 100644 index 2ca3bf641..000000000 --- a/docs/project-definition.md +++ /dev/null @@ -1,27 +0,0 @@ -### Project Definition: `zero-project.yml` -Each project is defined by this file. This manifest reflects all the options a user chose during the `zero init` step. It defines which modules are part of the project, each of their parameters, and is the source of truth for the templating (`zero create`) and provision (`zero apply`) steps. - -_Note: This file contains credentials, so make sure it is not shared with others._ - -| Parameters | Type | Description | -|--------------------------|--------------|------------------------------------------------| -| `name` | string | name of the project | -| `shouldPushRepositories` | boolean | whether to push the modules to version control | -| `modules` | map(modules) | a map containing modules of your project | - - -### Modules -| Parameters | Type | Description | -|--------------|-----------------|-------------------------------------------------------------------------| -| `parameters` | map(string) | key-value map of all the parameters to run the module | -| `files` | File | Stores information such as source-module location and destination | -| `dependsOn` | list(string) | a list of dependencies that should be fulfilled before this module | -| `conditions` | list(condition) | conditions to apply while templating out the module based on parameters | - -### Condition -| Parameters | Type | Description | -|--------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| -| `action` | enum(string) | type of condition, currently supports [`ignoreFile`] | -| `matchField` | string | Allows you to condition prompt based on another parameter's value | -| `WhenValue` | string | Matches for this value to satisfy the condition | -| `data` | list(string) | Supply extra data for condition to run `ignoreFile`: provide list of paths (file or directory path) to omit from module when condition is satisfied | diff --git a/docs/real-world-usage.md b/docs/real-world-usage.md deleted file mode 100644 index 9d02f5834..000000000 --- a/docs/real-world-usage.md +++ /dev/null @@ -1,49 +0,0 @@ -

- -

- -## Real-world Usage Scenarios - -### Developing and deploying application changes -1. Clone your git repository. -2. Make a branch, start working on your code. -3. If using the Telepresence dev experience, run the `start-dev-env.sh` script to allow you to use the hybrid cloud environment as you work, to run and test your code in a realistic environment. -3. Commit your finished code, make a PR, have it reviewed. Lightweight tests will run against your branch and prevent merging if they fail. -4. Merge your branch to the main branch. A build will start automatically. -5. The pipeline will build an artifact, run tests, deploy your change to staging, then wait for your input to deploy to production. - -### Debugging a problem on production -1. Check the logs of your service: - - If using cloudwatch, log into the AWS console and go to the [Logs Insights tool](https://us-west-2.console.aws.amazon.com/cloudwatch/home#logsV2:logs-insights). Choose the log group for your production environment ending in `/application` and hit the "Run query" button. - - If using kibana, make sure you are on the VPN and open the Kibana URL in your browser. Click the "Discover" tab and try searching for logs based on the name of your service. - - Alternatively, watch the logs in realtime via the CLI using the command `kubectl logs -f -l app=` or `stern ` -2. Check the state of your application pods. Look for strange events or errors from the pods: -```shell -$ kubectl get pods -$ kubectl get events -$ kubectl describe pods -``` -3. Exec into your application pod. From here you can check connectivity with `ping` or `nc`, or inspect anything else application-specific. -```shell -$ kubectl get pods -NAME READY STATUS RESTARTS AGE -your-service-6c5f6b56b7-2w447 1/1 Running 0 30m49s -$ kubectl exec -it your-service-6c5f6b56b7-2w447 sh -``` - - -### Adding support for a new subdomain or site -1. Check the currently configured ingresses in your cluster: -```shell -$ kubectl get ingress -A -NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE -your-service your-service api.your-service.dev abcd1234-1234.us-west-2.elb.amazonaws.com 80, 443 130d -``` -2. If this is for a new service entirely, make sure there is an ingress defined in the `kubernetes/` directory of your repo. If you want to add a new domain pointing to an existing service, just go into the file `kubernetes/overlays//ingress.yml` and add a section to `spec:` and `tls:`, specifying your new domain. - - `spec` is where you can define the hostname, any special path rules, and which service you want traffic to be sent to - - if your hostname is in the `tls` section, a TLS certificate will automatically be provisioned for it using Let's Encrypt -3. A number of things will happen once this is deployed to the cluster: - - Routing rules will be created to let traffic in to the cluster and send it to the service based on the hostname and path - - An AWS load balancer will be created if one doesn't already exist and it will be pointed to the cluster - - In the case of a subdomain, a DNS record will be automatically created for you - - A certificate will be provisioned using Let's Encrypt for the domain you specified diff --git a/docs/technology-choices.md b/docs/technology-choices.md deleted file mode 100644 index 138354435..000000000 --- a/docs/technology-choices.md +++ /dev/null @@ -1,167 +0,0 @@ -

- -

- -## Technology Choices -As we add features to Zero, we rely heavily on our years of experience with founding and growing startups, and judge tools and technologies based on the axes of: -- Quality - Is it the best tool for the job? Will it allow a project to start small and scale big? -- Simplicity - Is it easy to set up automatically and in a way that is easy to understand and maintain for the developers and operators of the project? -- Price - Ideally we look for open source tools, but there are some tools we integrate with that have a cost if we see it as providing enough value to justify that cost. In this case we will often try to also include an open source alternative. - -When there are multiple technologies that we consider to be front-runners, we try to add multiple options, along with documentation and use cases to describe in which situations each tool might be the right choice for a project. - -### Infrastructure -#### **Cloud Provider** - -[AWS](https://aws.amazon.com) - -AWS has been around much longer than the other large cloud providers, and while GCP or Azure may have some additional niceties in terms of developer experience, ML functionality, etc., most of the features and functionality are pretty common across all platforms. AWS is fairly low-cost, has many features, good API and CLI support, easy to set up, and with full support for infrastructure-as-code using Terraform. It can also be quite easy for startups to get credits to offset some of their initial costs. - -GCP and Azure support are planned but not implemented. - -#### **Orchestration** - -[Kubernetes](https://kubernetes.io) - -Initially developed by Google as a scaled-down, open source version of the Borg system that runs all their applications. It has become the de facto choice for container orchestration due to its huge community adoption, flexibility of deployment, and giant feature set. Between its native functionality, and various tools that we include by default, it's an incredibly powerful platform for easily deploying secure, stable, highly-available applications. It also has first-class support for managed clusters in all the major cloud providers. - -We have used Kubernetes at startups in the past and have found it to be an incredible tool to allow you to start small, but scale up a huge amount. It offers a lot of native functionality that enables great developer flows, zero-downtime deploys, auto scaling, high availability, easy visibility, and more. - -Compared to something like EC2, there are lots of benefits to deploying containers as immutable artifacts, good integration with load balancers, fast deploys, etc. - -Compared to serverless, it is much easier to control, monitor, and have visibility, in addition to having much more flexibility, while giving you quite a similar experience in many ways. - -#### **Database** - -[RDS MySQL](https://aws.amazon.com/rds/mysql/) / [RDS Postgresql](https://aws.amazon.com/rds/postgresql/) - -RDS MySQL and Postgres give you all the benefits of these RDBMS tools without the burden of managing them yourself. Either one of these database technologies are great for most startups, and allow you to scale quite large, depending on your schema design and data set. - -For large or complex data you can also potentially move to [RDS Aurora](https://aws.amazon.com/rds/aurora/) which has additional functionality which allows you to scale further. - -#### **Logging** - -[Elasticsearch + Kibana](https://aws.amazon.com/elasticsearch-service/) - -AWS Managed Elasticsearch with Kibana is a great tool for centralized logging from your system. We use a tool called [Fluentd](https://www.fluentd.org/) to collect all the logs from your system and send them to Elasticsearch. Then Kibana is used to run queries against that data, set up alerts, create dashboards, etc. - -This is a great choice if you want more flexibility and more advanced features. It adds some complexity due to requiring an Elasticsearch cluster, but AWS' managed ES offering allows you to offload a lot of work that would typically be required. - -_- OR -_ - -[Cloudwatch](https://aws.amazon.com/cloudwatch/) - -Potentially a cheaper and lighter-weight option, Cloudwatch is an AWS tool that supports many (but not all) of the features of Kibana. - -This is a good choice if you don't have too many requirements about logging yet. - -#### **Monitoring** - -[Prometheus](https://prometheus.io/) + [Grafana](https://grafana.com/) - -Prometheus and Grafana run in the Kubernetes cluster. Prometheus provides metrics collection from your applications and Grafana provides graphing, dashboards, alerting, etc. on that data. It can also pull in data from many other sources. - -This is a great choice if you want more flexibility and more advanced features. It adds some complexity due to requiring these tools to run in your cluster but does add a significant amount of features over Cloudwatch. - -_- OR -_ - -[Cloudwatch](https://aws.amazon.com/cloudwatch/) - -Potentially a lighter-weight option, Cloudwatch is an AWS tool that supports many (but not all) of the features of Grafana. - -This is a good choice if you don't have too many requirements about monitoring yet. - -#### **Access** -[VPN (Wireguard)](https://www.wireguard.com/) - -It is a good policy to keep as much of your infrastructure as possible private, exposing only what is necessary to the public internet. When we set up the Kubernetes cluster and other resources, they are all on private VPC Subnets so they can reach each other but are not otherwise reachable. When dealing with Kubernetes there is already great tooling for being able to access your application (via [`kubectl exec`](https://kubernetes.io/docs/tasks/debug-application-cluster/get-shell-running-container/)) but you may find cases where you want to access other resources as if you were on the private network yourself. - -To this end we are using Wireguard for VPN to allow your personal computer to act as if it were on the private network, having access to the things running inside your Kubernetes cluster, and within AWS. - -Wireguard is a great secure, light-weight tool that runs well on Kubernetes, so it doesn't require us to set up any other infrastructure. You may be able to get by without it if you are comfortable with the Kubernetes tooling, but it would be very useful if you are using something like Kibana above, so you can access it directly through your web browser. - -### Application - -#### **User Management** -[Ory Kratos](https://github.com/ory/kratos) - -Kratos is an open-source identity and user management tool. It can take the place of something like Auth0, or the user management that many startups end up writing themselves. By delegating this work to Kratos, you can save time and effort that you would otherwise have to put in to build a stable, secure user management system. - -If you are building a system that will require authenticated users, it may make sense to use Kratos with Oathkeeper (below) to save a lot of effort that may otherwise be spent building user management and auth features that have been built a million times before. - -#### **Authentication / Authorization** -[Ory Oathkeeper](https://github.com/ory/oathkeeper) - -Oathkeeper is an open-source Identity & Access Proxy that can securely act as a gateway to your system, preventing unauthorized access. It uses Oauth & JWT to log a user in and maintain a session, and proxies traffic to your services for users with valid sessions. - -This allows you to save time and effort by not having to write auth and session management code. If a specific header exists, the specified user is logged in. That's it. - -#### **Dev Experience** -[Telepresence](https://www.telepresence.io/) - -Telepresence is a great tool for creating a fast and effective "hybrid cloud/local" developer experience using Kubernetes. You can have your services, databases, and other dependencies running in the cloud, and then run the service you are working on locally, and have it override the one running in the cloud. In this way you can use all the same IDEs, debuggers, and local tools you usually do, but have your code running in a realistic environment much more like staging or production, complete with all the dependencies that can make local dev a pain. - -It's a great tool even when starting a project to quickly and easily test things in a realistic environment but can also really shine if you are working in a system that has many dependencies (multiple state stores, microservices, etc.) - -### Backend -While we offer ways to bootstrap your backend application in various languages, you can also choose to use whichever language you like and just make use of the infrastructure we set up, or use your custom backend with a bootstrapped frontend. - -The backend application will have a build and deploy pipeline that will build a docker image and push it to AWS' ECR image repository. The image will be used to deploy containers in the Kubernetes cluster. - -**Language** - -Whichever language you choose will be automatically set up, Dockerized, and deployed into the Kubernetes cluster. - -[Golang](https://golang.org/) - -Go is a great language for backend application development, especially in a microservices environment. It is a typed, compiled language with powerful support for parallel processing, and can create small, self-contained binaries for any operating system. It has a huge community, and is used by some very significant open source projects such as Kubernetes, and the HashiCorp tools. - -Being a compiled language may slightly raise the barrier to entry for newer developers. Lack of generic types and traditional object-oriented features, and preference for code generation may deter more experienced but unfamiliar developers. - -_- OR -_ - -[Node.js](https://nodejs.org/en/) - -Node.js is an extremely popular language for backend development. It has a huge community and tons of libraries available, since it is based on JavaScript. It can also be beneficial to use JavaScript for both the backend and frontend, in case developers are not familiar with other backend languages. - -Being a [single-threaded](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/), interpreted language, Node may not be ideal for high-performance applications. - - -### Frontend -While we offer ways to bootstrap your frontend application in various languages, you can also choose to use whichever language you like and just make use of the infrastructure we set up, or use your custom frontend with a bootstrapped backend. - -The frontend application will have a build and deploy pipeline that will build an artifact that will be uploaded to S3, and then hosted through AWS' Cloudfront CDN. This allows your application to be stable and fast from all over the world. - -**Language** - -[React.js](https://reactjs.org/) - -One of the most popular modern libraries for building dynamic frontend applications. React is hugely popular, powerful, and is an obvious choice for most frontends. - - -### CI - -We advocate for (and configure by default) build pipelines for deploying your application. As opposed to deploying manually via the command line which may work fine for a single developer, when you are working on a team there are huge benefits to making GitHub your source of truth, and relying on your version control system to trigger builds and deployments. Our preferred pipeline looks something like this: -``` -merge to main branch -> build artifacts -> run tests -> deploy to staging -> ask for user input -> deploy to production -``` -But you can also configure it to fit your desired workflow. - -[CircleCI](https://circleci.com/) - -CircleCI is a powerful tool for creating CI/CD pipelines. They have a free tier which is fully featured, with paid plans that add more concurrency and speed for builds. It requires a bit more setup at the beginning, as you need to create an account with them, but it does have some additional features compared to GitHub Actions. - -_- OR -_ - -[GitHub Actions](https://github.com/features/actions) - -GitHub Actions is newer than CircleCI, so it's features are a bit more limited, but the fact that it is integrated with GitHub makes it much easier to get started with. Also similar, it has a free tier with paid versions that add more concurrency. GHA would be useful for projects that don't require a lot of advanced features, visualization, etc. - -### Fundamentals -**[Twelve-Factor App](https://12factor.net/)** - -The Twelve-Factor App is a methodology for building Software-as-a-Service that encourages building applications in a way that inherently makes them more stable, secure, failure-safe, easier to measure, and easier to reason about. As much as possible we try to stick with these principles when building Zero, as we have seen it to be a very effective way to build scalable, manageable applications. - -**[CNCF](https://www.cncf.io/)** - -The Cloud Native Computing Foundation hosts and promotes a bunch of great open source software, including Kubernetes, Prometheus, Helm, Fluentd, and Envoy. Their principles and the design of many of the CNCF projects really resonate with the team behind Zero, and we try to make use of CNCF-backed tools whenever possible. diff --git a/go.mod b/go.mod index 42cf9e28b..1e2ec2e99 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,17 @@ module github.com/commitdev/zero -go 1.13 +go 1.16 require ( github.com/aws/aws-sdk-go v1.30.12 github.com/buger/goterm v1.0.0 - github.com/coreos/go-semver v0.2.0 + github.com/coreos/go-semver v0.3.0 github.com/gabriel-vasile/mimetype v1.1.1 github.com/google/go-cmp v0.3.1 github.com/google/uuid v1.1.1 github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02 github.com/hashicorp/go-version v1.2.1 + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/terraform v0.12.26 github.com/iancoleman/strcase v0.1.2 github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5 // indirect @@ -25,14 +26,15 @@ require ( github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.13 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/sirupsen/logrus v1.2.0 - github.com/spf13/cobra v0.0.6 - github.com/stretchr/testify v1.5.1 + github.com/sirupsen/logrus v1.6.0 + github.com/spf13/cobra v1.1.3 + github.com/stretchr/testify v1.7.0 github.com/termie/go-shutil v0.0.0-20140729215957-bcacb06fecae golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect + golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 79141173f..047239ad9 100644 --- a/go.sum +++ b/go.sum @@ -3,10 +3,19 @@ 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.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +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 v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= @@ -24,6 +33,7 @@ github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRY 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/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +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/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4= @@ -48,9 +58,8 @@ github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:o github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0= github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= github.com/apparentlymart/go-versions v0.0.2-0.20180815153302-64b99f7cb171/go.mod h1:JXY95WvQrPJQtudvNARshgWajS7jNNlM90altXIPNyI= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -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/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -64,6 +73,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= 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/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= @@ -82,8 +92,10 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 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-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +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 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/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-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -99,13 +111,12 @@ github.com/dylanmei/iso8601 v0.1.0/go.mod h1:w9KhXSgIyROl1DefbMYIE7UVSIvELTbMrCf github.com/dylanmei/winrmtest v0.0.0-20190225150635-99b7fe2fddf1/go.mod h1:lcy9/2gH1jn/VCLouHA6tOEwLoNVd4GW6zhuKLmHC2Y= 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/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v1.1.1 h1:qbN9MPuRf3bstHu9zkI9jDWNfH//9+9kHxr9oRBBBOA= github.com/gabriel-vasile/mimetype v1.1.1/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= 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-kit/kit v0.8.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= @@ -127,7 +138,6 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/protobuf v1.1.0/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/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= @@ -135,7 +145,6 @@ github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8l 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 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -144,6 +153,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/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.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 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= @@ -153,17 +163,19 @@ github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968/go.mod h1: github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw= 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/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/aws-sdk-go-base v0.4.0/go.mod h1:eRhlz3c4nhqxFZJAahJEFL7gh6Jyj5rQmQc7F9eHFyQ= github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 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-azure-helpers v0.10.0/go.mod h1:YuAtHxm2v74s+IjQwUG88dHBJPd5jL+cXr5BGVzSKhE= github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= -github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -172,6 +184,8 @@ github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02/go.mod h1:7q github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.0.0-20181001195459-61d530d6c27f/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa/go.mod h1:6ij3Z20p+OhOkCSrA0gImAWoHYQRGbnlcuk6XYTiaRw= +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-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= @@ -182,18 +196,20 @@ github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhE github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-slug v0.4.1/go.mod h1:I5tq5Lv0E2xcNXNkmx7BSfzi1PsJ2cNjs3cC3LwyhK8= github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +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-tfe v0.8.1/go.mod h1:XAV72S4O1iP8BDaqiaPLmL2B4EE6almocnOn8E8stHc= 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.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/go-version v1.2.1/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 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= 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 v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= 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= @@ -201,8 +217,12 @@ github.com/hashicorp/hcl/v2 v2.0.0/go.mod h1:oVVDG71tEinNGYCxinCYadcmKU9bglqW9pV github.com/hashicorp/hcl/v2 v2.3.0 h1:iRly8YaMwTBAKhn1Ybk7VSdzbnopghktCD031P8ggUE= github.com/hashicorp/hcl/v2 v2.3.0/go.mod h1:d+FwDBbOLvpAM3Z6J7gPj/VoAGkNe/gm352ZhjJ/Zv8= github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE= +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.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.0.0-20160124182025-e4ec8cc423bb/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/terraform v0.12.26 h1:FVsTCH1DMvTlzVSO2sKCzkwLczf/eZBO4GuY5IbHFk4= github.com/hashicorp/terraform v0.12.26/go.mod h1:CBxNAiTW0pLap44/3GU4j7cYE2bMhkKZNlHPcr4P55U= github.com/hashicorp/terraform-config-inspect v0.0.0-20191212124732-c6ae6269b9d7/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A= @@ -221,9 +241,11 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +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/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5 h1:Q5klzs6BL5FkassBX65t+KkG0XjYcjxEm+GNcQAsuaw= github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= @@ -236,8 +258,9 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/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= @@ -265,7 +288,7 @@ github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84= github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkBZfo= github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA= -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/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= @@ -286,6 +309,7 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-shellwords v1.0.4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +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/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -299,7 +323,10 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +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/panicwrap v1.0.0/go.mod h1:pKvZHwWrZowLUzftuFq7coarnxbBXU4aQh3N0BJOeeA= github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo= @@ -317,8 +344,8 @@ github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -340,36 +367,42 @@ github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 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/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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/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/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.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +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.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +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/pflag v1.0.2/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/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +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/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/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.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +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/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d/go.mod h1:BSTlc8jOjh0niykqEGVXOLXdi9o0r0kR8tCYiMvjFgw= github.com/tencentcloud/tencentcloud-sdk-go v1.0.191/go.mod h1:asUz5BPXxgoPGaRgZaVm1iGcUAuHyYUo1nXqKa83cvI= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.82+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tencentyun/cos-go-sdk-v5 v0.0.0-20190808065407-f07404cefc8c/go.mod h1:wk2XFUg6egk4tSDNZtXeKfe2G6690UVyt163PuUxBZk= github.com/termie/go-shutil v0.0.0-20140729215957-bcacb06fecae h1:vgGSvdW5Lqg+I1aZOlG32uyE6xHpLdKhZzcTEktz5wM= github.com/termie/go-shutil v0.0.0-20140729215957-bcacb06fecae/go.mod h1:quDq6Se6jlGwiIKia/itDZxqC5rj6/8OdFyMMAwTxCs= @@ -377,7 +410,6 @@ github.com/terraform-providers/terraform-provider-openstack v1.15.0/go.mod h1:2a github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/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 v0.0.0-20180813092308-00b869d2f4a5/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok= github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= @@ -386,7 +418,6 @@ github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0B github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20161029104018-1d6e34225557/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= @@ -403,39 +434,50 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190222235706-ffb98f73852f/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-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/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-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 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 h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +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-20180530234432-1e491301e022/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-20180811021610-c39426892332/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-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 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= 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-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -449,10 +491,12 @@ 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-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-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= @@ -461,6 +505,7 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -469,11 +514,9 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54 h1:rF3Ohx8DRyl8h2zw9qojyLHLhrJpEMgyPOImREEryf0= golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= 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= @@ -487,19 +530,27 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 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-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE= +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-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-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f h1:3MlESg/jvTr87F4ttA/q4B+uhe/q6qleC9/DP+IwQmY= +golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/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 h1:jbyannxz0XFD3zdjgrSUsaJbgpH4eTrkdhRChkHPfO8= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= +google.golang.org/api v0.13.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= @@ -512,13 +563,13 @@ 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-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= 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 h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= 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 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= 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.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= @@ -529,14 +580,22 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 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.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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/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 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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.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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/config/moduleconfig/module_config.go b/internal/config/moduleconfig/module_config.go index 2e634bb7d..f73dfa259 100644 --- a/internal/config/moduleconfig/module_config.go +++ b/internal/config/moduleconfig/module_config.go @@ -84,6 +84,7 @@ type Condition struct { MatchField string `yaml:"matchField"` WhenValue string `yaml:"whenValue"` Data []string `yaml:"data,omitempty"` + ElseValue string `yaml:"elseValue,omitempty"` } type Validate struct { @@ -265,6 +266,16 @@ func SummarizeConditions(module ModuleConfig) []projectconfig.Condition { return moduleConditions } +// GetFirstConditionElseValue returns the default value of the first condition that has a default +func GetFirstConditionElseValue(parameter Parameter) string { + for _, condition := range parameter.Conditions { + if condition.ElseValue != "" { + return condition.ElseValue + } + } + return "" +} + // UnmarshalYAML Parses a version constraint string into go-version constraint during yaml parsing func (semVer *VersionConstraints) UnmarshalYAML(unmarshal func(interface{}) error) error { var versionString string diff --git a/internal/config/projectconfig/init.go b/internal/config/projectconfig/init.go index 6a6a0f5aa..4f7fbd204 100644 --- a/internal/config/projectconfig/init.go +++ b/internal/config/projectconfig/init.go @@ -14,7 +14,10 @@ import ( ) const zeroProjectConfigTemplate = ` -# Templated zero-project.yml file +# zero-project.yml file containing all the required modules and their configuration. +# This file is generated by the zero init command but can be modified by hand before running zero create. +# Do not check this into source control, it may contain sensitive credentials. + name: {{.Name}} shouldPushRepositories: {{.ShouldPushRepositories | printf "%v"}} diff --git a/internal/init/prompts.go b/internal/init/prompts.go index f060f968a..fc33e0a84 100644 --- a/internal/init/prompts.go +++ b/internal/init/prompts.go @@ -26,39 +26,40 @@ const greenCheckMark = "\033[32m\U00002714\033[0m" const awsPickProfile = "Existing AWS Profiles" const awsManualInputCredentials = "Enter my own AWS credentials" +// PromptHandler defines how a user is prompted for a parameter, containing information about the parameter, conditions, and value validation type PromptHandler struct { moduleconfig.Parameter Condition CustomConditionSignature Validate func(string) error } +// CredentialPrompts is a list of prompts for sensitive credentials type CredentialPrompts struct { Vendor string Prompts []PromptHandler } +// CustomConditionSignature is the function signature of a custom condition. It takes a map of parameters and returns a boolean type CustomConditionSignature func(map[string]string) bool +// NoCondition is a no-op condition check function that always returns true func NoCondition(map[string]string) bool { return true } +// KeyMatchCondition is a condition that checks if the key matches the value func KeyMatchCondition(key string, value string) CustomConditionSignature { return func(param map[string]string) bool { return param[key] == value } } -func CustomCondition(fn CustomConditionSignature) CustomConditionSignature { - return func(param map[string]string) bool { - return fn(param) - } -} - +// NoValidation is a no-op validation function func NoValidation(string) error { return nil } +// SpecificValueValidation is a validation function that checks if the value is in the list of options func SpecificValueValidation(values ...string) func(string) error { return func(checkValue string) error { for _, allowedValue := range values { @@ -70,6 +71,7 @@ func SpecificValueValidation(values ...string) func(string) error { } } +// ValidateAKID checks if the input is a valid AWS Access Key ID func ValidateAKID(input string) error { // 20 uppercase alphanumeric characters var awsAccessKeyIDPat = regexp.MustCompile(`^[A-Z0-9]{20}$`) @@ -79,6 +81,7 @@ func ValidateAKID(input string) error { return nil } +// ValidateSAK checks if the input is a valid AWS Secret Access Key func ValidateSAK(input string) error { // 40 base64 characters var awsSecretAccessKeyPat = regexp.MustCompile(`^[A-Za-z0-9/+=]{40}$`) @@ -161,7 +164,13 @@ func (p PromptHandler) RunPrompt(projectParams map[string]string, envVarTranslat // Append the result to parameter map projectParams[p.Field] = sanitizeParameterValue(result) } else { - flog.Debugf("Skipping prompt(%s) due to condition failed", p.Field) + elseValue := moduleconfig.GetFirstConditionElseValue(p.Parameter) + if elseValue != "" { + flog.Debugf("Skipping prompt(%s) due to condition failed but assigning default value \"%s\"", p.Field, elseValue) + projectParams[p.Field] = elseValue + } else { + flog.Debugf("Skipping prompt(%s) due to condition failed", p.Field) + } } return nil } @@ -297,6 +306,7 @@ func availableProjectContext(projectConfig *projectconfig.ZeroProjectConfig) map } } +// paramConditionsMapper returns a condition checking function that checks if all the conditions are met func paramConditionsMapper(conditions []moduleconfig.Condition) CustomConditionSignature { if len(conditions) == 0 { return NoCondition @@ -314,6 +324,8 @@ func paramConditionsMapper(conditions []moduleconfig.Condition) CustomConditionS } } } + +// conditionHandler is a helper that accepts condition config and returns a function that checks if the condition is met func conditionHandler(cond moduleconfig.Condition) CustomConditionSignature { if cond.Action == "KeyMatchCondition" { return KeyMatchCondition(cond.MatchField, cond.WhenValue) diff --git a/internal/init/prompts_test.go b/internal/init/prompts_test.go index 5927cdc19..1a2b5e831 100644 --- a/internal/init/prompts_test.go +++ b/internal/init/prompts_test.go @@ -125,8 +125,8 @@ func TestGetParam(t *testing.T) { Conditions: []moduleconfig.Condition{ { Action: "KeyMatchCondition", - WhenValue: "pass", MatchField: "param1", + WhenValue: "pass", }, }, }, @@ -136,8 +136,8 @@ func TestGetParam(t *testing.T) { Conditions: []moduleconfig.Condition{ { Action: "KeyMatchCondition", - WhenValue: "not foo", MatchField: "param1", + WhenValue: "not pass", }, }, }, @@ -147,13 +147,25 @@ func TestGetParam(t *testing.T) { Conditions: []moduleconfig.Condition{ { Action: "KeyMatchCondition", - WhenValue: "pass", MatchField: "param1", + WhenValue: "pass", }, { Action: "KeyMatchCondition", - WhenValue: "pass", MatchField: "passing_condition", + WhenValue: "pass", + }, + }, + }, + { + Field: "condition_with_default", + Value: "pass", + Conditions: []moduleconfig.Condition{ + { + Action: "KeyMatchCondition", + MatchField: "param1", + WhenValue: "not pass", + ElseValue: "itsadefault", }, }, }, @@ -165,6 +177,7 @@ func TestGetParam(t *testing.T) { assert.Equal(t, "pass", projectParams["passing_condition"], "Expected to pass condition and set value") assert.NotContains(t, projectParams, "failing_condition", "Expected to fail condition and not set value") assert.Equal(t, "pass", projectParams["multiple_condition"], "Expected to pass multiple condition and set value") + assert.Equal(t, "itsadefault", projectParams["condition_with_default"], "Expected to set a default value for a condition that failed") }) t.Run("Should return error upon unsupported custom prompt type", func(t *testing.T) { From dc1b60d3492f4ecc445653b3a863933c6b613cab Mon Sep 17 00:00:00 2001 From: Bill Monkman Date: Wed, 6 Oct 2021 13:34:26 -0700 Subject: [PATCH 2/3] Bumped go version in github action --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cdaa43264..c0dddaffd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ orbs: variables: - &workspace /home/circleci/project - - &build-image circleci/golang:1.13.8 + - &build-image circleci/golang:1.16.8 aliases: # Shallow Clone - this allows us to cut the 2 minute repo clone down to about 10 seconds for repos with 50,000 commits+ From e088d10dc12b364fa6b03d385f8ee5fad6c5f03b Mon Sep 17 00:00:00 2001 From: Bill Monkman Date: Wed, 6 Oct 2021 13:39:45 -0700 Subject: [PATCH 3/3] Bumped go version in github action (oops, last commit was circleci) --- .github/workflows/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/config.yml b/.github/workflows/config.yml index b0d930cc2..5ee7fb875 100644 --- a/.github/workflows/config.yml +++ b/.github/workflows/config.yml @@ -10,13 +10,13 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: - go-version: 1.12 + go-version: 1.16 - uses: actions/cache@v2 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - - name: Run Go Tests + - name: Run Go Tests run: | make check