As it stands, we only configure those providers for which configuration is present. This can lead to surprising failure modes if those providers are then used to create resources. These changes ensure that all resource providers that are not configured during plan initialization are configured upon first load. Fixes #758.
76 lines
2.5 KiB
Go
76 lines
2.5 KiB
Go
// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/pulumi/pulumi/pkg/engine"
|
|
"github.com/pulumi/pulumi/pkg/resource/plugin"
|
|
"github.com/pulumi/pulumi/pkg/util/cmdutil"
|
|
"github.com/pulumi/pulumi/pkg/util/contract"
|
|
"github.com/pulumi/pulumi/pkg/workspace"
|
|
)
|
|
|
|
func newPluginCmd() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "plugin",
|
|
Short: "Manage language and resource provider plugins",
|
|
Long: "Manage language and resource provider plugins.\n" +
|
|
"\n" +
|
|
"Pulumi uses dynamically loaded plugins as an extensibility mechanism for\n" +
|
|
"supporting any number of languages and resource providers. These plugins are\n" +
|
|
"distributed out of band and must be installed manually. Attempting to use a\n" +
|
|
"package that provisions resources without the corresponding plugin will fail.\n" +
|
|
"\n" +
|
|
"You may write your own plugins, for example to implement custom languages or\n" +
|
|
"resources, although most people will never need to do this. To understand how to\n" +
|
|
"write and distribute your own plugins, please consult the relevant documentation.\n" +
|
|
"\n" +
|
|
"The plugin family of commands provides a way of explicitly managing plugins.",
|
|
Args: cmdutil.NoArgs,
|
|
}
|
|
|
|
cmd.AddCommand(newPluginInstallCmd())
|
|
cmd.AddCommand(newPluginLsCmd())
|
|
cmd.AddCommand(newPluginRmCmd())
|
|
|
|
return cmd
|
|
}
|
|
|
|
// getProjectPlugins fetches a list of plugins used by this project.
|
|
func getProjectPlugins() ([]workspace.PluginInfo, error) {
|
|
proj, root, err := readProject()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
projinfo := &engine.Projinfo{Proj: proj, Root: root}
|
|
pwd, main, ctx, err := engine.ProjectInfoContext(projinfo, nil, cmdutil.Diag(), nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get the required plugins and then ensure they have metadata populated about them. Because it's possible
|
|
// a plugin required by the project hasn't yet been installed, we will simply skip any errors we encounter.
|
|
var results []workspace.PluginInfo
|
|
plugins, err := ctx.Host.GetRequiredPlugins(plugin.ProgInfo{
|
|
Proj: proj,
|
|
Pwd: pwd,
|
|
Program: main,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, plugin := range plugins {
|
|
if dir, path, _ := workspace.GetPluginPath(plugin.Kind, plugin.Name, plugin.Version); path != "" {
|
|
err = plugin.SetFileMetadata(dir, path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
contract.IgnoreError(err)
|
|
}
|
|
results = append(results, plugin)
|
|
}
|
|
return results, nil
|
|
}
|