提交 9603a61f 编写于 作者: S Subhobrata Dey 提交者: LinuxSuRen

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
上级 86fd3315
......@@ -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{
......
......@@ -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
......
......@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册