Skip to content

Commit a0db7ee

Browse files
Alex Zhaovitreuz
Alex Zhao
authored andcommitted
will setup plugin home directory during configuration
- Added integration test for missing plugin directory during `install-plugin`. [finishes #146411359] Signed-off-by: Sebastian Vidrio <[email protected]>
1 parent bb34934 commit a0db7ee

6 files changed

+114
-7
lines changed

command/common/install_plugin_command.go

-4
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,6 @@ func (cmd *InstallPluginCommand) Setup(config command.Config, ui command.UI) err
7676

7777
func (cmd InstallPluginCommand) Execute([]string) error {
7878
log.WithField("PluginHome", cmd.Config.PluginHome()).Info("making plugin dir")
79-
err := os.MkdirAll(cmd.Config.PluginHome(), 0700)
80-
if err != nil {
81-
return err
82-
}
8379

8480
tempPluginDir, err := ioutil.TempDir(cmd.Config.PluginHome(), "temp")
8581
log.WithField("tempPluginDir", tempPluginDir).Debug("making tempPluginDir dir")

command/common/install_plugin_from_repo_command_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import (
44
"encoding/json"
55
"errors"
66
"fmt"
7+
"io/ioutil"
78
"math/rand"
89
"os"
910
"runtime"
10-
"strconv"
1111

1212
"code.cloudfoundry.org/cli/actor/actionerror"
1313
"code.cloudfoundry.org/cli/actor/pluginaction"
@@ -55,8 +55,9 @@ var _ = Describe("install-plugin command", func() {
5555
ProgressBar: fakeProgressBar,
5656
}
5757

58-
tmpDirectorySeed := strconv.Itoa(int(rand.Int63()))
59-
pluginHome = fmt.Sprintf("some-pluginhome-%s", tmpDirectorySeed)
58+
var err error
59+
pluginHome, err = ioutil.TempDir("", "some-pluginhome")
60+
Expect(err).ToNot(HaveOccurred())
6061
fakeConfig.PluginHomeReturns(pluginHome)
6162
binaryName = helpers.PrefixedRandomName("bin")
6263
fakeConfig.BinaryNameReturns(binaryName)

integration/plugin/install_plugin_command_test.go

+39
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,45 @@ var _ = Describe("install-plugin command", func() {
7777
})
7878
})
7979

80+
Context("when the plugin dir does not exist", func() {
81+
var (
82+
newPluginHome string
83+
84+
cfPluginHome string
85+
)
86+
87+
BeforeEach(func() {
88+
cfPluginHome = os.Getenv("CF_PLUGIN_HOME")
89+
90+
var err error
91+
newPluginHome, err = ioutil.TempDir("", "plugin-temp-dir")
92+
Expect(err).ToNot(HaveOccurred())
93+
Expect(os.RemoveAll(newPluginHome))
94+
95+
Expect(os.Setenv("CF_PLUGIN_HOME", newPluginHome)).ToNot(HaveOccurred())
96+
97+
pluginPath = helpers.BuildConfigurablePlugin("configurable_plugin", "some-plugin", "1.0.0",
98+
[]helpers.PluginCommand{
99+
{Name: "some-command", Help: "some-command-help"},
100+
},
101+
)
102+
})
103+
104+
AfterEach(func() {
105+
Expect(os.RemoveAll(newPluginHome)).ToNot(HaveOccurred())
106+
Expect(os.Setenv("CF_PLUGIN_HOME", cfPluginHome)).ToNot(HaveOccurred())
107+
})
108+
109+
It("creates the new directory, and continues as normal", func() {
110+
session := helpers.CF("install-plugin", pluginPath, "-f")
111+
Eventually(session).Should(Exit(0))
112+
113+
log.Println(newPluginHome)
114+
_, err := os.Stat(newPluginHome)
115+
Expect(os.IsNotExist(err)).To(Equal(false))
116+
})
117+
})
118+
80119
Describe("installing a plugin from a local file", func() {
81120
Context("when the file is compiled for a different os and architecture", func() {
82121
BeforeEach(func() {

main.go

+5
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ func executionWrapper(cmd flags.Commander, args []string) error {
169169
return err
170170
}
171171

172+
err = cfConfig.CreatePluginHome()
173+
if err != nil {
174+
return err
175+
}
176+
172177
// TODO: when the line in the old code under `cf` which calls
173178
// configv3.LoadConfig() is finally removed, then we should replace the code
174179
// path above with the following:

util/configv3/plugins_config.go

+4
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ func (config *Config) AddPlugin(plugin Plugin) {
8888
config.pluginsConfig.Plugins[plugin.Name] = plugin
8989
}
9090

91+
func (config *Config) CreatePluginHome() error {
92+
return os.MkdirAll(config.PluginHome(), 0700)
93+
}
94+
9195
// GetPlugin returns the requested plugin and true if it exists.
9296
func (config *Config) GetPlugin(pluginName string) (Plugin, bool) {
9397
plugin, exists := config.pluginsConfig.Plugins[pluginName]

util/configv3/plugins_config_test.go

+62
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"io/ioutil"
55
"os"
66
"path/filepath"
7+
"syscall"
78

89
. "code.cloudfoundry.org/cli/util/configv3"
910
. "github.com/onsi/ginkgo"
@@ -382,6 +383,67 @@ var _ = Describe("PluginsConfig", func() {
382383
})
383384
})
384385
})
386+
387+
Describe("CreatePluginHome", func() {
388+
var (
389+
config *Config
390+
391+
pluginHome string
392+
393+
executeErr error
394+
)
395+
396+
BeforeEach(func() {
397+
config = new(Config)
398+
399+
var err error
400+
pluginHome, err = ioutil.TempDir("", "my-plugin-home")
401+
Expect(err).ToNot(HaveOccurred())
402+
Expect(os.RemoveAll(pluginHome)).ToNot(HaveOccurred())
403+
})
404+
405+
AfterEach(func() {
406+
Expect(os.RemoveAll(pluginHome)).ToNot(HaveOccurred())
407+
})
408+
409+
JustBeforeEach(func() {
410+
executeErr = config.CreatePluginHome()
411+
})
412+
413+
Context("when it correctly writes a directory", func() {
414+
BeforeEach(func() {
415+
config.ENV.CFPluginHome = pluginHome
416+
})
417+
418+
It("returns no error", func() {
419+
Expect(executeErr).ToNot(HaveOccurred())
420+
421+
_, statErr := os.Stat(pluginHome)
422+
Expect(os.IsNotExist(statErr)).To(BeFalse())
423+
})
424+
})
425+
426+
Context("when it fails to write a directory", func() {
427+
var tempFile string
428+
429+
BeforeEach(func() {
430+
f, err := ioutil.TempFile("", "fail-plugin-home")
431+
Expect(err).ToNot(HaveOccurred())
432+
Expect(f.Close()).ToNot(HaveOccurred())
433+
tempFile = f.Name()
434+
435+
config.ENV.CFPluginHome = tempFile + "/some-path"
436+
})
437+
438+
AfterEach(func() {
439+
Expect(os.RemoveAll(tempFile)).ToNot(HaveOccurred())
440+
})
441+
442+
It("returns an error", func() {
443+
Expect(executeErr).To(MatchError(&os.PathError{Op: "mkdir", Path: tempFile, Err: syscall.ENOTDIR}))
444+
})
445+
})
446+
})
385447
})
386448

387449
Describe("Plugin", func() {

0 commit comments

Comments
 (0)