فهرست منبع

add upgrade notes endpoint

Alexander Belanger 4 سال پیش
والد
کامیت
b2c42f69cc
3فایلهای تغییر یافته به همراه86 افزوده شده و 9 حذف شده
  1. 15 9
      internal/helm/upgrade/upgrade.go
  2. 63 0
      server/api/template_handler.go
  3. 8 0
      server/router/router.go

+ 15 - 9
internal/helm/upgrade/upgrade.go

@@ -1,21 +1,23 @@
 package upgrade
 
 import (
+	"fmt"
+
 	semver "github.com/Masterminds/semver/v3"
 	"sigs.k8s.io/yaml"
 )
 
 // UpgradeFile is a collection of upgrade notes between specific versions
 type UpgradeFile struct {
-	UpgradeNotes []*UpgradeNote `yaml:"upgrade_notes"`
+	UpgradeNotes []*UpgradeNote `yaml:"upgrade_notes" json:"upgrade_notes"`
 }
 
 // UpgradeNote is a single note for upgrading between a previous version and
 // a target version.
 type UpgradeNote struct {
-	PreviousVersion string `yaml:"previous"`
-	TargetVersion   string `yaml:"target"`
-	Note            string `yaml:"note"`
+	PreviousVersion string `yaml:"previous" json:"previous"`
+	TargetVersion   string `yaml:"target" json:"target"`
+	Note            string `yaml:"note" json:"note"`
 }
 
 // ParseUpgradeFileFromBytes parses the raw bytes of an upgrade file and returns an
@@ -24,7 +26,7 @@ func ParseUpgradeFileFromBytes(upgradeNotes []byte) (*UpgradeFile, error) {
 	// parse bytes into object
 	res := &UpgradeFile{}
 
-	err := yaml.Unmarshal(bytes, form)
+	err := yaml.Unmarshal(upgradeNotes, res)
 
 	if err != nil {
 		return nil, err
@@ -53,23 +55,27 @@ func (u *UpgradeFile) GetUpgradeFileBetweenVersions(prev, target string) (*Upgra
 	resNotes := make([]*UpgradeNote, 0)
 
 	for _, note := range u.UpgradeNotes {
+		fmt.Println("ONE NOTE IS", note)
+
 		notePrevVersion, err := semver.NewVersion(note.PreviousVersion)
 
 		if err != nil {
 			return nil, err
 		}
 
-		noteTargetVersion, err := semver.NewVersion(note.PreviousVersion)
+		noteTargetVersion, err := semver.NewVersion(note.TargetVersion)
 
 		if err != nil {
 			return nil, err
 		}
 
+		fmt.Println(prev, target, prevVersion.Compare(notePrevVersion), targetVersion.Compare(noteTargetVersion))
+
 		// check that the previous version is not smaller than the note previous version
 		if comp := prevVersion.Compare(notePrevVersion); comp != -1 {
-			// check that the target version is not larger than the note target version
-			if comp := targetVersion.Compare(noteTargetVersion); comp != 1 {
-				resNotes := append(resNotes, note)
+			// check that the target version is smaller than the note target version
+			if comp := targetVersion.Compare(noteTargetVersion); comp != -1 {
+				resNotes = append(resNotes, note)
 			}
 		}
 	}

+ 63 - 0
server/api/template_handler.go

@@ -9,6 +9,7 @@ import (
 	"github.com/go-chi/chi"
 	"github.com/porter-dev/porter/internal/forms"
 	"github.com/porter-dev/porter/internal/helm/loader"
+	"github.com/porter-dev/porter/internal/helm/upgrade"
 	"github.com/porter-dev/porter/internal/templater/parser"
 
 	"github.com/porter-dev/porter/internal/models"
@@ -101,3 +102,65 @@ func (app *App) HandleReadTemplate(w http.ResponseWriter, r *http.Request) {
 
 	json.NewEncoder(w).Encode(res)
 }
+
+// HandleGetTemplateUpgradeNotes gets the upgrade notes for a template
+func (app *App) HandleGetTemplateUpgradeNotes(w http.ResponseWriter, r *http.Request) {
+	name := chi.URLParam(r, "name")
+	version := chi.URLParam(r, "version")
+
+	// if version passed as latest, pass empty string to loader to get latest
+	if version == "latest" {
+		version = ""
+	}
+
+	form := &forms.ChartForm{
+		Name:    name,
+		Version: version,
+		RepoURL: app.ServerConf.DefaultApplicationHelmRepoURL,
+	}
+
+	// look for the prev_version in the query params
+	vals, err := url.ParseQuery(r.URL.RawQuery)
+
+	if err != nil {
+		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
+		return
+	}
+
+	form.PopulateRepoURLFromQueryParams(vals)
+
+	prevVersion := "v0.0.0"
+
+	if prevVersionArr, ok := vals["prev_version"]; ok && len(prevVersionArr) == 1 {
+		prevVersion = prevVersionArr[0]
+	}
+
+	chart, err := loader.LoadChartPublic(form.RepoURL, form.Name, form.Version)
+
+	if err != nil {
+		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
+		return
+	}
+
+	res := &upgrade.UpgradeFile{}
+
+	for _, file := range chart.Files {
+		if strings.Contains(file.Name, "upgrade.yaml") {
+			upgradeFile, err := upgrade.ParseUpgradeFileFromBytes(file.Data)
+
+			if err != nil {
+				break
+			}
+
+			upgradeFile, err = upgradeFile.GetUpgradeFileBetweenVersions(prevVersion, version)
+
+			if err != nil {
+				break
+			}
+
+			res = upgradeFile
+		}
+	}
+
+	json.NewEncoder(w).Encode(res)
+}

+ 8 - 0
server/router/router.go

@@ -232,6 +232,14 @@ func New(a *api.App) *chi.Mux {
 				),
 			)
 
+			r.Method(
+				"GET",
+				"/templates/upgrade_notes/{name}/{version}",
+				auth.BasicAuthenticate(
+					requestlog.NewHandler(a.HandleGetTemplateUpgradeNotes, l),
+				),
+			)
+
 			// /api/oauth routes
 			r.Method(
 				"GET",