Explorar o código

added errors to docs

Alexander Belanger %!s(int64=5) %!d(string=hai) anos
pai
achega
81031e47d0
Modificáronse 3 ficheiros con 185 adicións e 11 borrados
  1. 92 5
      docs/API.md
  2. 21 4
      server/api/release_handler.go
  3. 72 2
      server/api/release_handler_test.go

+ 92 - 5
docs/API.md

@@ -499,7 +499,17 @@ User object with only the id field. Other fields are empty - with values in para
 
 **Successful Status Code**: `200`
 
-**Errors:** TBD
+**Errors:** 
+
+- Missing required field
+  - Status Code: `422`
+  - Request Body:
+    ```json
+    {
+      "code":601,
+      "errors":["required validation failed"]
+    }
+    ```
 
 #### `GET /api/releases/{name}/history`
 
@@ -580,7 +590,27 @@ User object with only the id field. Other fields are empty - with values in para
 
 **Successful Status Code**: `200`
 
-**Errors:** TBD
+**Errors:** 
+
+- Release not found
+  - Status Code: `404`
+  - Request Body:
+    ```json
+    {
+      "code":602,
+      "errors":["release not found"]
+    }
+    ```
+- Missing required field
+  - Status Code: `422`
+  - Request Body:
+    ```json
+    {
+      "code":601,
+      "errors":["required validation failed"]
+    }
+    ```
+
 
 #### `GET /api/releases/{name}/{revision}`
 
@@ -662,7 +692,26 @@ User object with only the id field. Other fields are empty - with values in para
 
 **Successful Status Code**: `200`
 
-**Errors:** TBD
+**Errors:** 
+
+- Release not found
+  - Status Code: `404`
+  - Request Body:
+    ```json
+    {
+      "code":602,
+      "errors":["release not found"]
+    }
+    ```
+- Missing required field
+  - Status Code: `422`
+  - Request Body:
+    ```json
+    {
+      "code":601,
+      "errors":["required validation failed"]
+    }
+    ```
 
 #### `POST /api/releases/{name}/rollback`
 
@@ -728,7 +777,26 @@ User object with only the id field. Other fields are empty - with values in para
 
 **Successful Status Code**: `200`
 
-**Errors:** TBD
+**Errors:** 
+
+- Rollback failed
+  - Status Code: `500`
+  - Request Body:
+    ```json
+    {
+      "code":603,
+      "errors":["rollback failed: <error>"]
+    }
+    ```
+- Missing required field
+  - Status Code: `422`
+  - Request Body:
+    ```json
+    {
+      "code":601,
+      "errors":["required validation failed"]
+    }
+    ```
 
 #### `POST /api/releases/{name}/upgrade`
 
@@ -793,4 +861,23 @@ User object with only the id field. Other fields are empty - with values in para
 
 **Successful Status Code**: `200`
 
-**Errors:** TBD
+**Errors:** 
+
+- Upgrade failed
+  - Status Code: `500`
+  - Request Body:
+    ```json
+    {
+      "code":603,
+      "errors":["upgrade failed: <error>"]
+    }
+    ```
+- Missing required field
+  - Status Code: `422`
+  - Request Body:
+    ```json
+    {
+      "code":601,
+      "errors":["required validation failed"]
+    }
+    ```

+ 21 - 4
server/api/release_handler.go

@@ -16,6 +16,7 @@ const (
 	ErrReleaseDecode ErrorCode = iota + 600
 	ErrReleaseValidateFields
 	ErrReleaseReadData
+	ErrReleaseDeploy
 )
 
 // HandleListReleases retrieves a list of releases for a cluster
@@ -82,7 +83,11 @@ func (app *App) HandleGetRelease(w http.ResponseWriter, r *http.Request) {
 	release, err := agent.GetRelease(form.Name, form.Revision)
 
 	if err != nil {
-		app.handleErrorRead(err, ErrReleaseReadData, w)
+		app.sendExternalError(err, http.StatusNotFound, HTTPError{
+			Code:   ErrReleaseReadData,
+			Errors: []string{"release not found"},
+		}, w)
+
 		return
 	}
 
@@ -118,7 +123,11 @@ func (app *App) HandleListReleaseHistory(w http.ResponseWriter, r *http.Request)
 	release, err := agent.GetReleaseHistory(form.Name)
 
 	if err != nil {
-		app.handleErrorFormValidation(err, ErrReleaseValidateFields, w)
+		app.sendExternalError(err, http.StatusNotFound, HTTPError{
+			Code:   ErrReleaseReadData,
+			Errors: []string{"release not found"},
+		}, w)
+
 		return
 	}
 
@@ -158,7 +167,11 @@ func (app *App) HandleUpgradeRelease(w http.ResponseWriter, r *http.Request) {
 	_, err = agent.UpgradeRelease(form.Name, form.Values)
 
 	if err != nil {
-		app.handleErrorInternal(err, w)
+		app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
+			Code:   ErrReleaseDeploy,
+			Errors: []string{"error upgrading release " + err.Error()},
+		}, w)
+
 		return
 	}
 
@@ -195,7 +208,11 @@ func (app *App) HandleRollbackRelease(w http.ResponseWriter, r *http.Request) {
 	err = agent.RollbackRelease(form.Name, form.Revision)
 
 	if err != nil {
-		app.handleErrorInternal(err, w)
+		app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
+			Code:   ErrReleaseDeploy,
+			Errors: []string{"error rolling back release " + err.Error()},
+		}, w)
+
 		return
 	}
 

+ 72 - 2
server/api/release_handler_test.go

@@ -91,7 +91,7 @@ var listReleasesTests = []*releaseTest{
 		initializers: []func(tester *tester){
 			initDefaultReleases,
 		},
-		msg:    "List releases",
+		msg:    "List releases no namespace",
 		method: "GET",
 		endpoint: "/api/releases?" + url.Values{
 			"namespace":    []string{""},
@@ -114,7 +114,7 @@ var listReleasesTests = []*releaseTest{
 		initializers: []func(tester *tester){
 			initDefaultReleases,
 		},
-		msg:       "List releases",
+		msg:       "List releases with namespace",
 		method:    "GET",
 		namespace: "default",
 		endpoint: "/api/releases?" + url.Values{
@@ -137,6 +137,29 @@ var listReleasesTests = []*releaseTest{
 			releaseReleaseArrBodyValidator,
 		},
 	},
+	&releaseTest{
+		initializers: []func(tester *tester){
+			initDefaultReleases,
+		},
+		msg:       "List releases missing required",
+		method:    "GET",
+		namespace: "default",
+		endpoint: "/api/releases?" + url.Values{
+			"namespace":    []string{"default"},
+			"storage":      []string{"memory"},
+			"limit":        []string{"20"},
+			"skip":         []string{"0"},
+			"byDate":       []string{"false"},
+			"statusFilter": []string{"deployed"},
+		}.Encode(),
+		body:      "",
+		expStatus: http.StatusUnprocessableEntity,
+		expBody:   `{"code":601,"errors":["required validation failed"]}`,
+		useCookie: true,
+		validators: []func(c *releaseTest, tester *tester, t *testing.T){
+			releaseBasicBodyValidator,
+		},
+	},
 }
 
 func TestHandleListReleases(t *testing.T) {
@@ -164,6 +187,26 @@ var getReleaseTests = []*releaseTest{
 			releaseReleaseBodyValidator,
 		},
 	},
+	&releaseTest{
+		initializers: []func(tester *tester){
+			initDefaultReleases,
+		},
+		msg:       "Release not found",
+		method:    "GET",
+		namespace: "default",
+		endpoint: "/api/releases/airwatch/5?" + url.Values{
+			"namespace": []string{""},
+			"context":   []string{"context-test"},
+			"storage":   []string{"memory"},
+		}.Encode(),
+		body:      "",
+		expStatus: http.StatusNotFound,
+		expBody:   `{"code":602,"errors":["release not found"]}`,
+		useCookie: true,
+		validators: []func(c *releaseTest, tester *tester, t *testing.T){
+			releaseBasicBodyValidator,
+		},
+	},
 }
 
 func TestHandleGetRelease(t *testing.T) {
@@ -191,6 +234,26 @@ var listReleaseHistoryTests = []*releaseTest{
 			releaseReleaseArrBodyValidator,
 		},
 	},
+	&releaseTest{
+		initializers: []func(tester *tester){
+			initDefaultReleases,
+		},
+		msg:       "Release not found",
+		method:    "GET",
+		namespace: "default",
+		endpoint: "/api/releases/asldfkja/history?" + url.Values{
+			"namespace": []string{""},
+			"context":   []string{"context-test"},
+			"storage":   []string{"memory"},
+		}.Encode(),
+		body:      "",
+		expStatus: http.StatusNotFound,
+		expBody:   `{"code":602,"errors":["release not found"]}`,
+		useCookie: true,
+		validators: []func(c *releaseTest, tester *tester, t *testing.T){
+			releaseBasicBodyValidator,
+		},
+	},
 }
 
 func TestHandleListReleaseHistory(t *testing.T) {
@@ -430,6 +493,13 @@ func makeReleases(agent *helm.Agent, rels []releaseStub) {
 	}
 }
 
+func releaseBasicBodyValidator(c *releaseTest, tester *tester, t *testing.T) {
+	if body := tester.rr.Body.String(); strings.TrimSpace(body) != strings.TrimSpace(c.expBody) {
+		t.Errorf("%s, handler returned wrong body: got %v want %v",
+			c.msg, body, c.expBody)
+	}
+}
+
 func releaseReleaseBodyValidator(c *releaseTest, tester *tester, t *testing.T) {
 	gotBody := &release.Release{}
 	expBody := &release.Release{}