Skip to content

Commit

Permalink
fix: replace go-input with use of CLI utils to fix powershell issues
Browse files Browse the repository at this point in the history
  • Loading branch information
danxmoran committed Jul 22, 2021
1 parent b0bff1d commit e66d76c
Show file tree
Hide file tree
Showing 11 changed files with 90 additions and 367 deletions.
10 changes: 5 additions & 5 deletions cmd/influx/bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import (
"context"
"fmt"

"github.com/influxdata/influx-cli/v2/pkg/duration"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/cmd/internal"
"github.com/influxdata/influxdb/v2/tenant"
"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -92,12 +92,12 @@ func (b *cmdBucketBuilder) cmdCreateRunEFn(*cobra.Command, []string) error {
return err
}

dur, err := internal.RawDurationToTimeDuration(b.retention)
dur, err := duration.RawDurationToTimeDuration(b.retention)
if err != nil {
return err
}

shardGroupDuration, err := internal.RawDurationToTimeDuration(b.shardGroupDuration)
shardGroupDuration, err := duration.RawDurationToTimeDuration(b.shardGroupDuration)
if err != nil {
return err
}
Expand Down Expand Up @@ -286,15 +286,15 @@ func (b *cmdBucketBuilder) cmdUpdateRunEFn(cmd *cobra.Command, args []string) er
}

if b.retention != "" {
dur, err := internal.RawDurationToTimeDuration(b.retention)
dur, err := duration.RawDurationToTimeDuration(b.retention)
if err != nil {
return err
}
update.RetentionPeriod = &dur
}

if b.shardGroupDuration != "" {
sgDur, err := internal.RawDurationToTimeDuration(b.shardGroupDuration)
sgDur, err := duration.RawDurationToTimeDuration(b.shardGroupDuration)
if err != nil {
return err
}
Expand Down
20 changes: 10 additions & 10 deletions cmd/influx/secret.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ import (
"context"
"fmt"

"github.com/influxdata/influx-cli/v2/pkg/stdio"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/cmd/internal"
isecret "github.com/influxdata/influxdb/v2/secret"
"github.com/influxdata/influxdb/v2/tenant"
"github.com/spf13/cobra"
"github.com/tcnksm/go-input"
)

type secretSVCsFn func() (influxdb.SecretService, influxdb.OrganizationService, func(*input.UI) string, error)
type secretSVCsFn func() (influxdb.SecretService, influxdb.OrganizationService, func(io stdio.StdIO) (string, error), error)

func cmdSecret(f *globalFlags, opt genericCLIOpts) *cobra.Command {
builder := newCmdSecretBuilder(newSecretSVCs, f, opt)
Expand Down Expand Up @@ -77,15 +76,14 @@ func (b *cmdSecretBuilder) cmdUpdateRunEFn(cmd *cobra.Command, args []string) er

ctx := context.Background()

ui := &input.UI{
Writer: b.genericCLIOpts.w,
Reader: b.genericCLIOpts.in,
}
var secretVal string
if b.value != "" {
secretVal = b.value
} else {
secretVal = getSecretFn(ui)
secretVal, err = getSecretFn(stdio.TerminalStdio)
if err != nil {
return err
}
}

err = scrSVC.PatchSecrets(ctx, orgID, map[string]string{
Expand Down Expand Up @@ -240,13 +238,15 @@ type (
}
)

func newSecretSVCs() (influxdb.SecretService, influxdb.OrganizationService, func(*input.UI) string, error) {
func newSecretSVCs() (influxdb.SecretService, influxdb.OrganizationService, func(io stdio.StdIO) (string, error), error) {
httpClient, err := newHTTPClient()
if err != nil {
return nil, nil, nil, err
}

orgSvc := &tenant.OrgClientService{Client: httpClient}

return &isecret.Client{Client: httpClient}, orgSvc, internal.GetSecret, nil
return &isecret.Client{Client: httpClient}, orgSvc, func(io stdio.StdIO) (string, error) {
return io.GetSecret("Please type your secret", 1)
}, nil
}
10 changes: 5 additions & 5 deletions cmd/influx/secret_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ import (
"io/ioutil"
"testing"

"github.com/influxdata/influx-cli/v2/pkg/stdio"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/mock"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
input "github.com/tcnksm/go-input"
)

func TestCmdSecret(t *testing.T) {
orgID := influxdb.ID(9000)

fakeSVCFn := func(svc influxdb.SecretService, fn func(*input.UI) string) secretSVCsFn {
return func() (influxdb.SecretService, influxdb.OrganizationService, func(*input.UI) string, error) {
fakeSVCFn := func(svc influxdb.SecretService, fn func(stdio.StdIO) (string, error)) secretSVCsFn {
return func() (influxdb.SecretService, influxdb.OrganizationService, func(stdio.StdIO) (string, error), error) {
return svc, &mock.OrganizationService{
FindOrganizationF: func(ctx context.Context, filter influxdb.OrganizationFilter) (*influxdb.Organization, error) {
return &influxdb.Organization{ID: orgID, Name: "influxdata"}, nil
Expand Down Expand Up @@ -212,8 +212,8 @@ func TestCmdSecret(t *testing.T) {
return nil
}

getSctFn := func(*input.UI) string {
return "ss"
getSctFn := func(stdio.StdIO) (string, error) {
return "ss", nil
}

return func(g *globalFlags, opt genericCLIOpts) *cobra.Command {
Expand Down
116 changes: 32 additions & 84 deletions cmd/influx/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,16 @@ import (
"context"
"errors"
"fmt"
"math"
"path/filepath"
"strconv"
"time"

"github.com/influxdata/influx-cli/v2/clients"
"github.com/influxdata/influx-cli/v2/clients/setup"
"github.com/influxdata/influx-cli/v2/pkg/stdio"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/cmd/influx/config"
"github.com/influxdata/influxdb/v2/cmd/influx/internal"
internal2 "github.com/influxdata/influxdb/v2/cmd/internal"
"github.com/influxdata/influxdb/v2/tenant"
"github.com/spf13/cobra"
"github.com/tcnksm/go-input"
)

var setupFlags struct {
Expand Down Expand Up @@ -88,8 +86,8 @@ func setupUserF(cmd *cobra.Command, args []string) error {
Client: client,
}

ui := input.UI{Reader: cmd.InOrStdin(), Writer: cmd.OutOrStdout()}
req, err := onboardingRequest(&ui)
w := stdio.TerminalStdio

This comment has been minimized.

Copy link
@williamhbaker

williamhbaker Jul 22, 2021

Contributor

I tried this out with powershell and noticed a minor problem when doing influx setup:

  • When entering my password for the second time and having the prompt at the bottom of my terminal, the second prompt for "please type your password again" appears over the top of the previous line, and the previous line kind of stays weirdly in the "background".
    This is right before I submit the command for my password:
    image
    Then this is what immediately comes up after hitting enter...almost looks like I have typed something, but I haven't...that's just the shadow of the previous input:
    image
    ... the remaining commands work fine, and it works fine if I just type in my password a second time though.
req, err := onboardingRequest(w)
if err != nil {
return fmt.Errorf("failed to retrieve data to setup instance: %v", err)
}
Expand All @@ -99,7 +97,6 @@ func setupUserF(cmd *cobra.Command, args []string) error {
return fmt.Errorf("failed to setup instance: %v", err)
}

w := ui.Writer
if setupFlags.json {
return writeJSON(w, map[string]interface{}{
"user": result.User.Name,
Expand Down Expand Up @@ -152,8 +149,8 @@ func setupF(cmd *cobra.Command, args []string) error {
return err
}

ui := input.UI{Reader: cmd.InOrStdin(), Writer: cmd.OutOrStdout()}
req, err := onboardingRequest(&ui)
w := stdio.TerminalStdio
req, err := onboardingRequest(w)
if err != nil {
return fmt.Errorf("failed to setup instance: %v", err)
}
Expand All @@ -176,10 +173,7 @@ func setupF(cmd *cobra.Command, args []string) error {
if _, err = localConfigSVC.CreateConfig(p); err != nil {
return fmt.Errorf("failed to write config to path %q: %v", dPath, err)
}

w := ui.Writer
fmt.Fprintln(w,
string(internal2.PromptWithColor(fmt.Sprintf("Config %s has been stored in %s.", p.Name, dPath), internal2.ColorCyan)))
_ = w.Banner(fmt.Sprintf("Config %s has been stored in %s.", p.Name, dPath))

if setupFlags.json {
return writeJSON(w, map[string]interface{}{
Expand Down Expand Up @@ -227,79 +221,33 @@ func validateNoNameCollision(localConfigSvc config.Service, configName string) e
return nil
}

func onboardingRequest(ui *input.UI) (*influxdb.OnboardingRequest, error) {
if (setupFlags.force || len(setupFlags.password) > 0) && len(setupFlags.password) < internal2.MinPasswordLen {
return nil, internal2.ErrPasswordIsTooShort
}

req := &influxdb.OnboardingRequest{
User: setupFlags.username,
Password: setupFlags.password,
Org: setupFlags.org,
Bucket: setupFlags.bucket,
RetentionPeriodSeconds: influxdb.InfiniteRetention,
Token: setupFlags.token,
}

if setupFlags.retention != "" {
dur, err := internal2.RawDurationToTimeDuration(setupFlags.retention)
if err != nil {
return nil, err
}
secs, nanos := math.Modf(dur.Seconds())
if nanos > 0 {
return nil, fmt.Errorf("retention policy %q is too precise, must be divisible by 1s", setupFlags.retention)
}
req.RetentionPeriodSeconds = int64(secs)
}

if setupFlags.force {
return req, nil
}

fmt.Fprintln(ui.Writer, string(internal2.PromptWithColor("Welcome to InfluxDB 2.0!", internal2.ColorYellow)))
if req.User == "" {
req.User = internal2.GetInput(ui, "Please type your primary username", "")
func onboardingRequest(stdio stdio.StdIO) (*influxdb.OnboardingRequest, error) {
setupClient := setup.Client{CLI: clients.CLI{StdIO: stdio}}
cliReq, err := setupClient.OnboardingRequest(&setup.Params{
Username: setupFlags.username,
Password: setupFlags.password,
AuthToken: setupFlags.token,
Org: setupFlags.org,
Bucket: setupFlags.bucket,
Retention: setupFlags.retention,
Force: setupFlags.force,
})
if err != nil {
return nil, err
}
if req.Password == "" {
req.Password = internal2.GetPassword(ui, false)
req := influxdb.OnboardingRequest{
User: cliReq.Username,
Org: cliReq.Org,
Bucket: cliReq.Bucket,
}
if req.Org == "" {
req.Org = internal2.GetInput(ui, "Please type your primary organization name", "")
if cliReq.Password != nil {
req.Password = *cliReq.Password
}
if req.Bucket == "" {
req.Bucket = internal2.GetInput(ui, "Please type your primary bucket name", "")
if cliReq.RetentionPeriodSeconds != nil {
req.RetentionPeriodSeconds = *cliReq.RetentionPeriodSeconds
}

// Check the initial opts instead of the req to distinguish not-set from explicit 0 over the CLI.
if setupFlags.retention == "" {
infiniteStr := strconv.Itoa(influxdb.InfiniteRetention)
for {
rpStr := internal2.GetInput(ui,
"Please type your retention period in hours.\nOr press ENTER for infinite", infiniteStr)
rp, err := strconv.Atoi(rpStr)
if rp >= 0 && err == nil {
req.RetentionPeriodSeconds = int64((time.Duration(rp) * time.Hour).Seconds())
break
}
}
if cliReq.Token != nil {
req.Token = *cliReq.Token
}

if confirmed := internal2.GetConfirm(ui, func() string {
rp := "infinite"
if req.RetentionPeriodSeconds > 0 {
rp = (time.Duration(req.RetentionPeriodSeconds) * time.Second).String()
}
return fmt.Sprintf(`
You have entered:
Username: %s
Organization: %s
Bucket: %s
Retention Period: %s
`, req.User, req.Org, req.Bucket, rp)
}); !confirmed {
return nil, errors.New("setup was canceled")
}

return req, nil
return &req, nil
}
38 changes: 14 additions & 24 deletions cmd/influx/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,14 @@ import (
"time"

"github.com/fatih/color"
"github.com/influxdata/influx-cli/v2/pkg/stdio"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/cmd/influx/internal"
internal2 "github.com/influxdata/influxdb/v2/cmd/internal"
ierror "github.com/influxdata/influxdb/v2/kit/errors"
"github.com/influxdata/influxdb/v2/pkger"
"github.com/influxdata/influxdb/v2/tenant"
"github.com/olekukonko/tablewriter"
"github.com/spf13/cobra"
input "github.com/tcnksm/go-input"
)

type templateSVCsFn func() (pkger.SVC, influxdb.OrganizationService, error)
Expand Down Expand Up @@ -212,7 +211,10 @@ func (b *cmdTemplateBuilder) applyRunEFn(cmd *cobra.Command, args []string) erro
if !isTTY {
for _, envRef := range missingValKeys(providedEnvRefs) {
prompt := "Please provide environment reference value for key " + envRef
providedEnvRefs[envRef] = b.getInput(prompt, "")
providedEnvRefs[envRef], err = stdio.TerminalStdio.GetStringInput(prompt, "")
if err != nil {
return err
}
}
}

Expand Down Expand Up @@ -242,11 +244,13 @@ func (b *cmdTemplateBuilder) applyRunEFn(cmd *cobra.Command, args []string) erro

providedSecrets := mapKeys(dryRunImpact.Summary.MissingSecrets, b.applyOpts.secrets)
if !isTTY {
const skipDefault = "$$skip-this-key$$"
for _, secretKey := range missingValKeys(providedSecrets) {
prompt := "Please provide secret value for key " + secretKey + " (optional, press enter to skip)"
secretVal := b.getInput(prompt, skipDefault)
if secretVal != "" && secretVal != skipDefault {
secretVal, err := stdio.TerminalStdio.GetSecret(prompt, 0)
if err != nil {
return err
}
if secretVal != "" {
providedSecrets[secretKey] = secretVal
}
}
Expand All @@ -258,8 +262,7 @@ func (b *cmdTemplateBuilder) applyRunEFn(cmd *cobra.Command, args []string) erro

isForced, _ := strconv.ParseBool(b.applyOpts.force)
if !isTTY && !isForced && b.applyOpts.force != "conflict" {
confirm := b.getInput("Confirm application of the above resources (y/n)", "n")
if strings.ToLower(confirm) != "y" {
if !stdio.TerminalStdio.GetConfirm("Confirm application of the above resources") {
fmt.Fprintln(b.w, "aborted application of template")
return nil
}
Expand Down Expand Up @@ -814,8 +817,7 @@ func (b *cmdTemplateBuilder) stackRemoveRunEFn(cmd *cobra.Command, args []string

if !b.force {
msg := fmt.Sprintf("Confirm removal of the stack[%s] and all associated resources (y/n)", stack.ID)
confirm := b.getInput(msg, "n")
if confirm != "y" {
if !stdio.TerminalStdio.GetConfirm(msg) {
continue
}
}
Expand Down Expand Up @@ -949,12 +951,8 @@ func (b *cmdTemplateBuilder) stackUpdateRunEFn(cmd *cobra.Command, args []string
const msg = `
Your stack now differs from your template. Applying an outdated template will revert
these updates. Export a new template with these updates to prevent accidental changes? (y/n)`
for range make([]struct{}, 3) {
if in := b.getInput(msg, "n"); in == "y" {
break
} else if in == "n" {
return nil
}
if !stdio.TerminalStdio.GetConfirm(msg) {
return nil
}
}

Expand Down Expand Up @@ -1124,14 +1122,6 @@ func (b *cmdTemplateBuilder) readLines(r io.Reader) ([]string, error) {
return stdinInput, nil
}

func (b *cmdTemplateBuilder) getInput(msg, defaultVal string) string {
ui := &input.UI{
Writer: b.w,
Reader: b.in,
}
return internal2.GetInput(ui, msg, defaultVal)
}

func (b *cmdTemplateBuilder) convertURLEncoding(url string) pkger.Encoding {
urlBase := path.Ext(url)
switch {
Expand Down

0 comments on commit e66d76c

Please sign in to comment.