Ver Fonte

function for upgrade

Alexander Belanger há 5 anos atrás
pai
commit
ed42672129
6 ficheiros alterados com 149 adições e 1 exclusões
  1. 2 1
      go.mod
  2. 3 0
      go.sum
  3. 14 0
      internal/forms/chart.go
  4. 33 0
      internal/helm/agent.go
  5. 37 0
      internal/helm/agent_test.go
  6. 60 0
      server/api/chart_handler.go

+ 2 - 1
go.mod

@@ -5,6 +5,7 @@ go 1.14
 require (
 	github.com/Azure/go-autorest/autorest v0.11.1 // indirect
 	github.com/DATA-DOG/go-sqlmock v1.5.0
+	github.com/Masterminds/semver v1.5.0 // indirect
 	github.com/cosmtrek/air v1.21.2 // indirect
 	github.com/creack/pty v1.1.11 // indirect
 	github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 // indirect
@@ -49,7 +50,7 @@ require (
 	k8s.io/cli-runtime v0.18.8
 	k8s.io/client-go v0.18.8
 	k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac // indirect
-	k8s.io/helm v2.16.12+incompatible // indirect
+	k8s.io/helm v2.16.12+incompatible
 	k8s.io/klog v1.0.0 // indirect
 	k8s.io/klog/v2 v2.2.0 // indirect
 	k8s.io/utils v0.0.0-20200912215256-4140de9c8800 // indirect

+ 3 - 0
go.sum

@@ -65,6 +65,8 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp
 github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
 github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg=
 github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
+github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
+github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk=
 github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
 github.com/Masterminds/sprig/v3 v3.1.0 h1:j7GpgZ7PdFqNsmncycTHsLmVPf5/3wJtlgW9TNDYD9Y=
@@ -1276,6 +1278,7 @@ k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgS
 k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/helm v2.16.12+incompatible h1:K2zhF8+B85Ya1n7n3eH34xwwp5qNUM42TBFENDZJT7w=
 k8s.io/helm v2.16.12+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI=
 k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=

+ 14 - 0
internal/forms/chart.go

@@ -90,3 +90,17 @@ type ListChartHistoryForm struct {
 	*ChartForm
 	Name string `json:"name" form:"required"`
 }
+
+// RollbackChartForm represents the accepted values for getting a single Helm chart
+type RollbackChartForm struct {
+	*ChartForm
+	Name     string `json:"name" form:"required"`
+	Revision int    `json:"revision" form:"required"`
+}
+
+// UpgradeChartForm represents the accepted values for updating a Helm chart
+type UpgradeChartForm struct {
+	*ChartForm
+	Name   string `json:"name" form:"required"`
+	Values string `json:"values" form:"required"`
+}

+ 33 - 0
internal/helm/agent.go

@@ -1,8 +1,11 @@
 package helm
 
 import (
+	"fmt"
+
 	"helm.sh/helm/v3/pkg/action"
 	"helm.sh/helm/v3/pkg/release"
+	"k8s.io/helm/pkg/chartutil"
 )
 
 // Agent is a Helm agent for performing helm operations
@@ -43,3 +46,33 @@ func (a *Agent) GetReleaseHistory(
 
 	return cmd.Run(name)
 }
+
+// UpgradeChart upgrades a specific chart using a string of values.yaml
+func (a *Agent) UpgradeChart(
+	name string,
+	values string,
+) (*release.Release, error) {
+	// grab the latest release
+	rel, err := a.GetRelease(name, 0)
+
+	if err != nil {
+		return nil, err
+	}
+
+	ch := rel.Chart
+
+	cmd := action.NewUpgrade(a.ActionConfig)
+	valuesYaml, err := chartutil.ReadValues([]byte(values))
+
+	if err != nil {
+		return nil, fmt.Errorf("Unable to upgrade the release because values could not be parsed: %v", err)
+	}
+
+	res, err := cmd.Run(name, ch, valuesYaml)
+
+	if err != nil {
+		return nil, fmt.Errorf("Unable to upgrade the release: %v", err)
+	}
+
+	return res, nil
+}

+ 37 - 0
internal/helm/agent_test.go

@@ -246,3 +246,40 @@ func TestListReleaseHistory(t *testing.T) {
 		compareReleaseToStubs(t, releases, tc.expRes)
 	}
 }
+
+var upgradeTests = []listReleaseTest{
+	listReleaseTest{
+		name:      "simple history test",
+		namespace: "default",
+		releases: []releaseStub{
+			releaseStub{"wordpress", "default", 2, "1.0.2", release.StatusDeployed},
+			releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
+		},
+		expRes: []releaseStub{
+			releaseStub{"wordpress", "default", 1, "1.0.1", release.StatusSuperseded},
+			releaseStub{"wordpress", "default", 2, "1.0.2", release.StatusSuperseded},
+			releaseStub{"wordpress", "default", 3, "1.0.2", release.StatusDeployed},
+		},
+	},
+}
+
+func TestUpgradeChart(t *testing.T) {
+	for _, tc := range upgradeTests {
+		agent := newAgentFixture(t, tc.namespace)
+		makeReleases(t, agent, tc.releases)
+
+		// calling agent.ActionConfig.Releases.Create in makeReleases will automatically set the
+		// namespace, so we have to reset the namespace of the storage driver
+		agent.ActionConfig.Releases.Driver.(*driver.Memory).SetNamespace(tc.namespace)
+
+		agent.UpgradeChart("wordpress", "")
+
+		releases, err := agent.GetReleaseHistory("wordpress")
+
+		if err != nil {
+			t.Errorf("%v", err)
+		}
+
+		compareReleaseToStubs(t, releases, tc.expRes)
+	}
+}

+ 60 - 0
server/api/chart_handler.go

@@ -195,3 +195,63 @@ func (app *App) HandleListChartHistory(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 }
+
+// HandleUpdateChart upgrades a chart with new values.yaml
+// func (app *App) HandleUpdateChart(w http.ResponseWriter, r *http.Request) {
+// 	session, err := app.store.Get(r, app.cookieName)
+
+// 	if err != nil {
+// 		app.handleErrorFormDecoding(err, ErrChartDecode, w)
+// 		return
+// 	}
+
+// 	name := chi.URLParam(r, "name")
+
+// 	// get the filter options
+// 	form := &forms.ListChartHistoryForm{
+// 		ChartForm: &forms.ChartForm{
+// 			Form: &helm.Form{},
+// 		},
+// 		Name: name,
+// 	}
+
+// 	vals, err := url.ParseQuery(r.URL.RawQuery)
+
+// 	if err != nil {
+// 		app.handleErrorFormDecoding(err, ErrChartDecode, w)
+// 		return
+// 	}
+
+// 	form.PopulateHelmOptionsFromQueryParams(vals)
+
+// 	if sessID, ok := session.Values["user_id"].(uint); ok {
+// 		form.PopulateHelmOptionsFromUserID(sessID, app.repo.User)
+// 	}
+
+// 	// validate the form
+// 	if err := app.validator.Struct(form); err != nil {
+// 		app.handleErrorFormValidation(err, ErrChartValidateFields, w)
+// 		return
+// 	}
+
+// 	// create a new agent
+// 	var agent *helm.Agent
+
+// 	if app.testing {
+// 		agent = app.TestAgents.HelmAgent
+// 	} else {
+// 		agent, err = helm.GetAgentOutOfClusterConfig(form.ChartForm.Form, app.logger)
+// 	}
+
+// 	release, err := agent.GetReleaseHistory(form.Name)
+
+// 	if err != nil {
+// 		app.handleErrorFormValidation(err, ErrChartValidateFields, w)
+// 		return
+// 	}
+
+// 	if err := json.NewEncoder(w).Encode(release); err != nil {
+// 		app.handleErrorFormDecoding(err, ErrChartDecode, w)
+// 		return
+// 	}
+// }