Browse Source

add get upgrade notes endpoint

Alexander Belanger 4 years ago
parent
commit
a27e86aece

+ 3 - 4
api/server/handlers/template/get.go

@@ -4,11 +4,11 @@ import (
 	"net/http"
 	"strings"
 
-	"github.com/go-chi/chi"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/shared"
 	"github.com/porter-dev/porter/api/server/shared/apierrors"
 	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/server/shared/requestutils"
 	"github.com/porter-dev/porter/api/types"
 	"github.com/porter-dev/porter/internal/helm/loader"
 	"github.com/porter-dev/porter/internal/templater/parser"
@@ -37,9 +37,8 @@ func (t *TemplateGetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
-	// TODO: get url params elegantly
-	name := chi.URLParam(r, "name")
-	version := chi.URLParam(r, "version")
+	name, _ := requestutils.GetURLParamString(r, types.URLParamTemplateName)
+	version, _ := requestutils.GetURLParamString(r, types.URLParamTemplateVersion)
 
 	// if version passed as latest, pass empty string to loader to get latest
 	if version == "latest" {

+ 82 - 0
api/server/handlers/template/get_upgrade_notes.go

@@ -0,0 +1,82 @@
+package template
+
+import (
+	"net/http"
+	"strings"
+
+	"github.com/porter-dev/porter/api/server/handlers"
+	"github.com/porter-dev/porter/api/server/shared"
+	"github.com/porter-dev/porter/api/server/shared/apierrors"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/server/shared/requestutils"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/helm/loader"
+	"github.com/porter-dev/porter/internal/helm/upgrade"
+)
+
+type TemplateGetUpgradeNotesHandler struct {
+	handlers.PorterHandlerReadWriter
+}
+
+func NewTemplateGetUpgradeNotesHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *TemplateGetUpgradeNotesHandler {
+	return &TemplateGetUpgradeNotesHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+	}
+}
+
+func (t *TemplateGetUpgradeNotesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	request := &types.GetTemplateUpgradeNotesRequest{}
+
+	ok := t.DecodeAndValidate(w, r, request)
+
+	if !ok {
+		return
+	}
+
+	name, _ := requestutils.GetURLParamString(r, types.URLParamTemplateName)
+	version, _ := requestutils.GetURLParamString(r, types.URLParamTemplateVersion)
+
+	// if version passed as latest, pass empty string to loader to get latest
+	if version == "latest" {
+		version = ""
+	}
+
+	prevVersion := request.PrevVersion
+
+	if prevVersion == "" {
+		prevVersion = "v0.0.0"
+	}
+
+	chart, err := loader.LoadChartPublic(request.RepoURL, name, version)
+
+	if err != nil {
+		t.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		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
+		}
+	}
+
+	t.WriteResult(w, r, res)
+}

+ 37 - 2
api/server/router/user.go

@@ -1,6 +1,8 @@
 package router
 
 import (
+	"fmt"
+
 	"github.com/go-chi/chi"
 	"github.com/porter-dev/porter/api/server/handlers/project"
 	"github.com/porter-dev/porter/api/server/handlers/template"
@@ -263,8 +265,12 @@ func getUserRoutes(
 			Verb:   types.APIVerbGet,
 			Method: types.HTTPVerbGet,
 			Path: &types.Path{
-				Parent:       basePath,
-				RelativePath: "/templates/{name}/{version}",
+				Parent: basePath,
+				RelativePath: fmt.Sprintf(
+					"/templates/{%s}/{%s}",
+					types.URLParamTemplateName,
+					types.URLParamTemplateVersion,
+				),
 			},
 			Scopes: []types.PermissionScope{types.UserScope},
 		},
@@ -282,5 +288,34 @@ func getUserRoutes(
 		Router:   r,
 	})
 
+	// GET /api/templates/{name}/{version}/upgrade_notes -> template.NewTemplateGetUpgradeNotesHandler
+	getTemplateUpgradeNotesEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbGet,
+			Method: types.HTTPVerbGet,
+			Path: &types.Path{
+				Parent: basePath,
+				RelativePath: fmt.Sprintf(
+					"/templates/{%s}/{%s}/upgrade_notes",
+					types.URLParamTemplateName,
+					types.URLParamTemplateVersion,
+				),
+			},
+			Scopes: []types.PermissionScope{types.UserScope},
+		},
+	)
+
+	getTemplateUpgradeNotesRequest := template.NewTemplateGetUpgradeNotesHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: getTemplateUpgradeNotesEndpoint,
+		Handler:  getTemplateUpgradeNotesRequest,
+		Router:   r,
+	})
+
 	return routes
 }

+ 16 - 1
api/types/template.go

@@ -1,6 +1,14 @@
 package types
 
-import "helm.sh/helm/v3/pkg/chart"
+import (
+	"github.com/porter-dev/porter/internal/helm/upgrade"
+	"helm.sh/helm/v3/pkg/chart"
+)
+
+const (
+	URLParamTemplateName    URLParam = "name"
+	URLParamTemplateVersion URLParam = "version"
+)
 
 type TemplateGetBaseRequest struct {
 	RepoURL string `schema:"repo_url"`
@@ -31,3 +39,10 @@ type GetTemplateResponse struct {
 	Values   map[string]interface{} `json:"values"`
 	Form     *FormYAML              `json:"form"`
 }
+
+type GetTemplateUpgradeNotesRequest struct {
+	TemplateGetBaseRequest
+	PrevVersion string `schema:"prev_version"`
+}
+
+type GetTemplateUpgradeNotesResponse upgrade.UpgradeFile

+ 1 - 1
docs/developing/backend-refactor-status.md

@@ -144,7 +144,7 @@
 | <li>- [ ] `DELETE /api/projects/{project_id}/slack_integrations/{slack_integration_id}`                                     |             |                 |             |                  |
 | <li>- [ ] `GET /api/readyz`                                                                                                 |             |                 |             |                  |
 | <li>- [X] `GET /api/templates`                                                                                              | AB          |                 |             |                  |
-| <li>- [ ] `GET /api/templates/upgrade_notes/{name}/{version}`                                                               |             |                 |             |                  |
+| <li>- [X] `GET /api/templates/upgrade_notes/{name}/{version}`                                                               | AB          | yes             |             |                  |
 | <li>- [X] `GET /api/templates/{name}/{version}`                                                                             | AB          |                 |             |                  |
 | <li>- [x] `POST /api/users`                                                                                                 | AB          | yes             |             | yes              |
 | <li>- [x] `GET /api/users/{user_id}`                                                                                        | AB          | yes             |             | yes              |