Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 35 additions & 20 deletions pkg/commands/profile/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,23 @@ import (
"path/filepath"
"strings"

"github.com/fastly/go-fastly/v8/fastly"

"github.com/fastly/cli/pkg/cmd"
"github.com/fastly/cli/pkg/config"
fsterr "github.com/fastly/cli/pkg/errors"
"github.com/fastly/cli/pkg/global"
"github.com/fastly/cli/pkg/profile"
"github.com/fastly/cli/pkg/text"
"github.com/fastly/go-fastly/v8/fastly"
)

// CreateCommand represents a Kingpin command.
type CreateCommand struct {
cmd.Base

clientFactory APIClientFactory
profile string
automationToken bool
clientFactory APIClientFactory
profile string
}

// NewCreateCommand returns a new command registered in the parent.
Expand All @@ -32,6 +34,7 @@ func NewCreateCommand(parent cmd.Registerer, cf APIClientFactory, g *global.Data
c.Globals = g
c.CmdClause = parent.Command("create", "Create user profile")
c.CmdClause.Arg("profile", "Profile to create (default 'user')").Default("user").Short('p').StringVar(&c.profile)
c.CmdClause.Flag("automation-token", "Expected input will be an 'automation token' instead of a 'user token'").BoolVar(&c.automationToken)
c.clientFactory = cf
return &c
}
Expand All @@ -54,7 +57,7 @@ func (c *CreateCommand) Exec(in io.Reader, out io.Writer) (err error) {
}
}

if err := c.tokenFlow(c.profile, def, in, out); err != nil {
if err := c.tokenFlow(def, in, out); err != nil {
return err
}
if err := c.persistCfg(); err != nil {
Expand All @@ -67,7 +70,7 @@ func (c *CreateCommand) Exec(in io.Reader, out io.Writer) (err error) {
}

// tokenFlow initialises the token flow.
func (c *CreateCommand) tokenFlow(profileName string, def bool, in io.Reader, out io.Writer) error {
func (c *CreateCommand) tokenFlow(def bool, in io.Reader, out io.Writer) error {
token, err := promptForToken(in, out, c.Globals.ErrLog)
if err != nil {
return err
Expand All @@ -87,12 +90,12 @@ func (c *CreateCommand) tokenFlow(profileName string, def bool, in io.Reader, ou
}
}()

user, err := c.validateToken(token, endpoint, spinner)
email, err := c.validateToken(token, endpoint, spinner)
if err != nil {
return err
}

return c.updateInMemCfg(profileName, user.Login, token, endpoint, def, spinner)
return c.updateInMemCfg(email, token, endpoint, def, spinner)
}

func promptForToken(in io.Reader, out io.Writer, errLog fsterr.LogInterface) (string, error) {
Expand Down Expand Up @@ -122,10 +125,10 @@ func validateTokenNotEmpty(s string) error {
var ErrEmptyToken = errors.New("token cannot be empty")

// validateToken ensures the token can be used to acquire user data.
func (c *CreateCommand) validateToken(token, endpoint string, spinner text.Spinner) (*fastly.User, error) {
func (c *CreateCommand) validateToken(token, endpoint string, spinner text.Spinner) (string, error) {
err := spinner.Start()
if err != nil {
return nil, err
return "", err
}
msg := "Validating token"
spinner.Message(msg + "...")
Expand All @@ -140,10 +143,10 @@ func (c *CreateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error regenerating Fastly API client: %w", err)
return "", fmt.Errorf("error regenerating Fastly API client: %w", err)
}

t, err := client.GetTokenSelf()
Expand All @@ -153,10 +156,19 @@ func (c *CreateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error validating token: %w", err)
return "", fmt.Errorf("error validating token: %w", err)
}

if c.automationToken {
spinner.StopMessage(msg)
err = spinner.Stop()
if err != nil {
return "", err
}
return fmt.Sprintf("Automation Token (%s)", t.ID), nil
}

user, err := client.GetUser(&fastly.GetUserInput{
Expand All @@ -170,22 +182,25 @@ func (c *CreateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error fetching token user: %w", err)
return "", fsterr.RemediationError{
Inner: fmt.Errorf("error fetching token user: %w", err),
Remediation: "If providing an 'automation token', retry the command with the `--automation-token` flag set.",
}
}

spinner.StopMessage(msg)
err = spinner.Stop()
if err != nil {
return nil, err
return "", err
}
return user, nil
return user.Login, nil
}

// updateInMemCfg persists the updated configuration data in-memory.
func (c *CreateCommand) updateInMemCfg(profileName, email, token, endpoint string, def bool, spinner text.Spinner) error {
func (c *CreateCommand) updateInMemCfg(email, token, endpoint string, def bool, spinner text.Spinner) error {
err := spinner.Start()
if err != nil {
return err
Expand All @@ -198,7 +213,7 @@ func (c *CreateCommand) updateInMemCfg(profileName, email, token, endpoint strin
if c.Globals.Config.Profiles == nil {
c.Globals.Config.Profiles = make(config.Profiles)
}
c.Globals.Config.Profiles[profileName] = &config.Profile{
c.Globals.Config.Profiles[c.profile] = &config.Profile{
Default: def,
Email: email,
Token: token,
Expand All @@ -208,7 +223,7 @@ func (c *CreateCommand) updateInMemCfg(profileName, email, token, endpoint strin
// we'll call Set for its side effect of resetting all other profiles to have
// their Default field set to false.
if def {
if p, ok := profile.Set(profileName, c.Globals.Config.Profiles); ok {
if p, ok := profile.Set(c.profile, c.Globals.Config.Profiles); ok {
c.Globals.Config.Profiles = p
}
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/commands/profile/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ type TokenCommand struct {
func NewTokenCommand(parent cmd.Registerer, g *global.Data) *TokenCommand {
var c TokenCommand
c.Globals = g
c.CmdClause = parent.Command("token", "Print access token (defaults to the 'active' profile)")
c.CmdClause.Arg("profile", "Print access token for the named profile").Short('p').StringVar(&c.profile)
c.CmdClause = parent.Command("token", "Print API token (defaults to the 'active' profile)")
c.CmdClause.Arg("profile", "Print API token for the named profile").Short('p').StringVar(&c.profile)
return &c
}

Expand Down
42 changes: 27 additions & 15 deletions pkg/commands/profile/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import (
"fmt"
"io"

"github.com/fastly/go-fastly/v8/fastly"

"github.com/fastly/cli/pkg/api"
"github.com/fastly/cli/pkg/cmd"
"github.com/fastly/cli/pkg/config"
fsterr "github.com/fastly/cli/pkg/errors"
"github.com/fastly/cli/pkg/global"
"github.com/fastly/cli/pkg/profile"
"github.com/fastly/cli/pkg/text"
"github.com/fastly/go-fastly/v8/fastly"
)

// APIClientFactory allows the profile command to regenerate the global Fastly
Expand All @@ -23,8 +24,9 @@ type APIClientFactory func(token, endpoint string) (api.Interface, error)
type UpdateCommand struct {
cmd.Base

clientFactory APIClientFactory
profile string
automationToken bool
clientFactory APIClientFactory
profile string
}

// NewUpdateCommand returns a usable command registered under the parent.
Expand All @@ -33,6 +35,7 @@ func NewUpdateCommand(parent cmd.Registerer, cf APIClientFactory, g *global.Data
c.Globals = g
c.CmdClause = parent.Command("update", "Update user profile")
c.CmdClause.Arg("profile", "Profile to update (defaults to the currently active profile)").Short('p').StringVar(&c.profile)
c.CmdClause.Flag("automation-token", "Expected input will be an 'automation token' instead of a 'user token'").BoolVar(&c.automationToken)
c.clientFactory = cf
return &c
}
Expand Down Expand Up @@ -110,12 +113,12 @@ func (c *UpdateCommand) Exec(in io.Reader, out io.Writer) error {

endpoint, _ := c.Globals.Endpoint()

u, err := c.validateToken(token, endpoint, spinner)
email, err := c.validateToken(token, endpoint, spinner)
if err != nil {
return err
}
opts = append(opts, func(p *config.Profile) {
p.Email = u.Login
p.Email = email
})

var ok bool
Expand All @@ -140,10 +143,10 @@ func (c *UpdateCommand) Exec(in io.Reader, out io.Writer) error {
}

// validateToken ensures the token can be used to acquire user data.
func (c *UpdateCommand) validateToken(token, endpoint string, spinner text.Spinner) (*fastly.User, error) {
func (c *UpdateCommand) validateToken(token, endpoint string, spinner text.Spinner) (string, error) {
err := spinner.Start()
if err != nil {
return nil, err
return "", err
}
msg := "Validating token"
spinner.Message(msg + "...")
Expand All @@ -158,10 +161,10 @@ func (c *UpdateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error regenerating Fastly API client: %w", err)
return "", fmt.Errorf("error regenerating Fastly API client: %w", err)
}

t, err := client.GetTokenSelf()
Expand All @@ -171,10 +174,19 @@ func (c *UpdateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error validating token: %w", err)
return "", fmt.Errorf("error validating token: %w", err)
}

if c.automationToken {
spinner.StopMessage(msg)
err = spinner.Stop()
if err != nil {
return "", err
}
return fmt.Sprintf("Automation Token (%s)", t.ID), nil
}

user, err := client.GetUser(&fastly.GetUserInput{
Expand All @@ -188,16 +200,16 @@ func (c *UpdateCommand) validateToken(token, endpoint string, spinner text.Spinn
spinner.StopFailMessage(msg)
spinErr := spinner.StopFail()
if spinErr != nil {
return nil, spinErr
return "", spinErr
}

return nil, fmt.Errorf("error fetching token user: %w", err)
return "", fmt.Errorf("error fetching token user: %w", err)
}

spinner.StopMessage(msg)
err = spinner.Stop()
if err != nil {
return nil, err
return "", err
}
return user, nil
return user.Login, nil
}