pulumi/cmd/login.go
Pat Gavlin 9c5526e7dd
Add a --config-file option for stack ops (#2258)
This option allows the user to override the file used to fetch and store
configuration information for a stack. It is available for the config,
destroy, logs, preview, refresh, and up commands.

Note that this option is not persistent: if it is not specified, the
stack's default configuration will be used. If an alternate config file
is used exclusively for a stack, it must be specified to all commands
that interact with that stack.

This option can be used to share plaintext configuration across multiple
stacks. It cannot be used to share secret configuration, as secrets are
associated with a particular stack and cannot be decryptex by other
stacks.
2018-11-30 15:11:05 -08:00

113 lines
3.9 KiB
Go

// Copyright 2016-2018, Pulumi Corporation.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"fmt"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"github.com/pulumi/pulumi/pkg/backend"
"github.com/pulumi/pulumi/pkg/backend/display"
"github.com/pulumi/pulumi/pkg/backend/filestate"
"github.com/pulumi/pulumi/pkg/backend/httpstate"
"github.com/pulumi/pulumi/pkg/util/cmdutil"
)
func newLoginCmd() *cobra.Command {
var cloudURL string
var localMode bool
cmd := &cobra.Command{
Use: "login [<url>]",
Short: "Log into the Pulumi service",
Long: "Log into the Pulumi service.\n" +
"\n" +
"The service manages your stack's state reliably. Simply run\n" +
"\n" +
" $ pulumi login\n" +
"\n" +
"and this command will prompt you for an access token, including a way to launch your web browser to\n" +
"easily obtain one. You can script by using PULUMI_ACCESS_TOKEN environment variable.\n" +
"\n" +
"By default, this will log into app.pulumi.com. If you prefer to log into a separate instance\n" +
"of the Pulumi service, such as Pulumi Enterprise, specify a <url>. For example, run\n" +
"\n" +
" $ pulumi login https://pulumi.acmecorp.com\n" +
"\n" +
"to log in to a Pulumi Enterprise server running at the pulumi.acmecorp.com domain.\n" +
"\n" +
"For https:// URLs, the CLI will speak REST to a service that manages state and concurrency control.\n" +
"If you prefer to operate Pulumi independently of a service, and entirely local to your computer,\n" +
"pass file://<path>, where <path> will be where state checkpoints will be stored. For instance,\n" +
"\n" +
" $ pulumi login file://~\n" +
"\n" +
"will store your state information on your computer underneath ~/.pulumi. It is then up to you to\n" +
"manage this state, including backing it up, using it in a team environment, and so on.\n" +
"\n" +
"As a shortcut, you may pass --local to use your home directory (this is an alias for file://~):\n" +
"\n" +
" $ pulumi login --local\n",
Args: cmdutil.MaximumNArgs(1),
Run: cmdutil.RunFunc(func(cmd *cobra.Command, args []string) error {
displayOptions := display.Options{
Color: cmdutil.GetGlobalColorization(),
}
// If a <cloud> was specified as an argument, use it.
if len(args) > 0 {
if cloudURL != "" {
return errors.New("only one of --cloud-url or argument URL may be specified, not both")
}
cloudURL = args[0]
}
// For local mode, store state by default in the user's home directory.
if localMode {
if cloudURL != "" {
return errors.New("a URL may not be specified when --local mode is enabled")
}
cloudURL = "file://~"
}
var be backend.Backend
var err error
if filestate.IsLocalBackendURL(cloudURL) {
be, err = filestate.Login(cmdutil.Diag(), cloudURL, "")
} else {
be, err = httpstate.Login(commandContext(), cmdutil.Diag(), cloudURL, "", displayOptions)
}
if err != nil {
return errors.Wrapf(err, "problem logging in")
}
if currentUser, err := be.CurrentUser(); err == nil {
fmt.Printf("Logged into %s as %s (%s)\n", be.Name(), currentUser, be.URL())
} else {
fmt.Printf("Logged into %s (%s)\n", be.Name(), be.URL())
}
return nil
}),
}
cmd.PersistentFlags().StringVarP(&cloudURL, "cloud-url", "c", "", "A cloud URL to log into")
cmd.PersistentFlags().BoolVarP(&localMode, "local", "l", false, "Use Pulumi in local-only mode")
return cmd
}