From 9603a61f2fed1395c4b5bd83971135557988eb41 Mon Sep 17 00:00:00 2001 From: Subhobrata Dey Date: Tue, 5 Nov 2019 16:29:43 -0800 Subject: [PATCH] Add support to install a specific version of plugin (#211) * #75 Add support to install a specific version of plugin * #75 Add support to install a specific version of plugin --- client/pluginManager_test.go | 22 +++++++++++++--- client/pluginManger.go | 49 ++++++++++++++++++++++++++++++++---- client/test_methods.go | 5 ++++ 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/client/pluginManager_test.go b/client/pluginManager_test.go index 7f3588f..89facc4 100644 --- a/client/pluginManager_test.go +++ b/client/pluginManager_test.go @@ -38,16 +38,16 @@ var _ = Describe("PluginManager test", func() { Context("basic function test", func() { It("get install plugin query string", func() { names := make([]string, 0) - Expect(getPluginsInstallQuery(names)).To(Equal("")) + Expect(pluginMgr.getPluginsInstallQuery(names)).To(Equal("")) names = append(names, "abc") - Expect(getPluginsInstallQuery(names)).To(Equal("plugin.abc=")) + Expect(pluginMgr.getPluginsInstallQuery(names)).To(Equal("plugin.abc=")) names = append(names, "def") - Expect(getPluginsInstallQuery(names)).To(Equal("plugin.abc=&plugin.def=")) + Expect(pluginMgr.getPluginsInstallQuery(names)).To(Equal("plugin.abc=&plugin.def=")) names = append(names, "") - Expect(getPluginsInstallQuery(names)).To(Equal("plugin.abc=&plugin.def=")) + Expect(pluginMgr.getPluginsInstallQuery(names)).To(Equal("plugin.abc=&plugin.def=")) }) }) @@ -141,6 +141,13 @@ var _ = Describe("PluginManager test", func() { Expect(err).To(BeNil()) }) + It("normal case with version, should success", func() { + PrepareForInstallPluginWithVersion(roundTripper, pluginMgr.URL, pluginName, "1.0", "", "") + + err := pluginMgr.InstallPlugin([]string{pluginName + "@" + "1.0"}) + Expect(err).To(BeNil()) + }) + It("with 400", func() { PrepareForInstallPluginWithCode(roundTripper, 400, pluginMgr.URL, pluginName, "", "") @@ -148,6 +155,13 @@ var _ = Describe("PluginManager test", func() { Expect(err).NotTo(BeNil()) }) + It("with 400 & version", func() { + PrepareForInstallPluginWithCode(roundTripper, 400, pluginMgr.URL, pluginName + "@" + "1.0", "", "") + + err := pluginMgr.InstallPlugin([]string{pluginName + "@" + "1.0"}) + Expect(err).NotTo(BeNil()) + }) + It("with 400, error message", func() { response := PrepareForInstallPluginWithCode(roundTripper, 400, pluginMgr.URL, pluginName, "", "") response.Header = map[string][]string{ diff --git a/client/pluginManger.go b/client/pluginManger.go index 2fbddcd..4b8460e 100644 --- a/client/pluginManger.go +++ b/client/pluginManger.go @@ -69,6 +69,8 @@ type InstalledPlugin struct { BackVersion string } +var debugLogFile = "debug.html" + // CheckUpdate fetch the latest plugins from update center site func (p *PluginManager) CheckUpdate(handle func(*http.Response)) (err error) { api := "/pluginManager/checkUpdatesServer" @@ -92,20 +94,37 @@ func (p *PluginManager) GetPlugins() (pluginList *InstalledPluginList, err error return } -func getPluginsInstallQuery(names []string) string { +func (p *PluginManager) getPluginsInstallQuery(names []string) string { pluginNames := make([]string, 0) for _, name := range names { if name == "" { continue } - pluginNames = append(pluginNames, fmt.Sprintf("plugin.%s=", name)) + if !strings.Contains(name, "@") { + pluginNames = append(pluginNames, fmt.Sprintf("plugin.%s=", name)) + } + } + return strings.Join(pluginNames, "&") +} + +func (p *PluginManager) getVersionalPlugins(names []string) string { + pluginNames := make([]string, 0) + for _, name := range names { + if strings.Contains(name, "@") { + if err := p.installPluginWithVersion(name); err != nil { + fmt.Println(err) + } + pluginNames = append(pluginNames, fmt.Sprintf("plugin.%s,", name)) + } } return strings.Join(pluginNames, "&") } // InstallPlugin install a plugin by name func (p *PluginManager) InstallPlugin(names []string) (err error) { - api := fmt.Sprintf("/pluginManager/install?%s", getPluginsInstallQuery(names)) + api := fmt.Sprintf("/pluginManager/install?%s", p.getPluginsInstallQuery(names)) + versionalPlugins := p.getVersionalPlugins(names) + fmt.Println(versionalPlugins) var response *http.Response response, err = p.RequestWithResponse("POST", api, nil, nil) @@ -121,6 +140,26 @@ func (p *PluginManager) InstallPlugin(names []string) (err error) { return } +// InstallPluginWithVersion install a plugin by name & version +func (p *PluginManager) installPluginWithVersion(name string) (err error) { + pluginAPI := PluginAPI{} + pluginName := "%s.hpi" + pluginVersion := strings.Split(name, "@") + + defer os.Remove(fmt.Sprintf(pluginName, name)) + url := fmt.Sprintf("http://updates.jenkins-ci.org/download/plugins/%s/%s/%s.hpi", + pluginVersion[0], pluginVersion[1], pluginVersion[0]) + + if err := pluginAPI.download(url, name); err != nil { + return err + } + + if err = p.Upload(fmt.Sprintf(pluginName, name)); err != nil { + return err + } + return nil +} + // UninstallPlugin uninstall a plugin by name func (p *PluginManager) UninstallPlugin(name string) (err error) { api := fmt.Sprintf("/pluginManager/plugin/%s/doUninstall", name) @@ -133,7 +172,7 @@ func (p *PluginManager) UninstallPlugin(name string) (err error) { if statusCode != 200 { err = fmt.Errorf("unexpected status code: %d", statusCode) if p.Debug { - ioutil.WriteFile("debug.html", data, 0664) + ioutil.WriteFile(debugLogFile, data, 0664) } } } @@ -158,7 +197,7 @@ func (p *PluginManager) Upload(pluginFile string) (err error) { } else if response.StatusCode != 200 { err = fmt.Errorf("StatusCode: %d", response.StatusCode) if data, readErr := ioutil.ReadAll(response.Body); readErr == nil && p.Debug { - ioutil.WriteFile("debug.html", data, 0664) + ioutil.WriteFile(debugLogFile, data, 0664) } } return err diff --git a/client/test_methods.go b/client/test_methods.go index 77ceb19..59332ff 100644 --- a/client/test_methods.go +++ b/client/test_methods.go @@ -407,6 +407,11 @@ func PrepareForInstallPlugin(roundTripper *mhttp.MockRoundTripper, rootURL, plug PrepareForInstallPluginWithCode(roundTripper, 200, rootURL, pluginName, user, passwd) } +// PrepareForInstallPluginWithVersion only for test +func PrepareForInstallPluginWithVersion(roundTripper *mhttp.MockRoundTripper, rootURL, pluginName, version, user, passwd string) { + PrepareForInstallPluginWithCode(roundTripper, 200, rootURL, pluginName + "@" + version, user, passwd) +} + // PrepareForInstallPluginWithCode only for test func PrepareForInstallPluginWithCode(roundTripper *mhttp.MockRoundTripper, statusCode int, rootURL, pluginName, user, passwd string) (response *http.Response) { -- GitLab