diff --git a/api/models/route.go b/api/models/route.go index e216dbf21..a93ae2ca4 100644 --- a/api/models/route.go +++ b/api/models/route.go @@ -49,10 +49,6 @@ var ( func (r *Route) Validate() error { var res []error - if r.Image == "" { - res = append(res, ErrRoutesValidationMissingImage) - } - if r.Memory == 0 { r.Memory = 128 } diff --git a/api/server/routes_create.go b/api/server/routes_create.go index abdb69772..7374110ee 100644 --- a/api/server/routes_create.go +++ b/api/server/routes_create.go @@ -37,6 +37,10 @@ func handleRouteCreate(c *gin.Context) { return } + if wroute.Route.Image == "" { + c.JSON(http.StatusBadRequest, simpleError(models.ErrRoutesValidationMissingImage)) + return + } err = Api.Runner.EnsureImageExists(ctx, &runner.Config{ Image: wroute.Route.Image, }) diff --git a/api/server/routes_test.go b/api/server/routes_test.go index ed35d8bfe..a8ec4ce40 100644 --- a/api/server/routes_test.go +++ b/api/server/routes_test.go @@ -25,7 +25,8 @@ func TestRouteCreate(t *testing.T) { {&datastore.Mock{}, "/v1/apps/a/routes", ``, http.StatusBadRequest, models.ErrInvalidJSON}, {&datastore.Mock{}, "/v1/apps/a/routes", `{ }`, http.StatusBadRequest, models.ErrRoutesMissingNew}, {&datastore.Mock{}, "/v1/apps/a/routes", `{ "path": "/myroute" }`, http.StatusBadRequest, models.ErrRoutesMissingNew}, - {&datastore.Mock{}, "/v1/apps/a/routes", `{ "route": { } }`, http.StatusInternalServerError, models.ErrRoutesValidationMissingImage}, + {&datastore.Mock{}, "/v1/apps/a/routes", `{ "route": { } }`, http.StatusInternalServerError, models.ErrRoutesValidationMissingPath}, + {&datastore.Mock{}, "/v1/apps/a/routes", `{ "route": { "path": "/myroute" } }`, http.StatusBadRequest, models.ErrRoutesValidationMissingImage}, {&datastore.Mock{}, "/v1/apps/a/routes", `{ "route": { "image": "iron/hello" } }`, http.StatusInternalServerError, models.ErrRoutesValidationMissingPath}, {&datastore.Mock{}, "/v1/apps/a/routes", `{ "route": { "image": "iron/hello", "path": "myroute" } }`, http.StatusInternalServerError, models.ErrRoutesValidationInvalidPath}, {&datastore.Mock{}, "/v1/apps/$/routes", `{ "route": { "image": "iron/hello", "path": "/myroute" } }`, http.StatusInternalServerError, models.ErrAppsValidationInvalidName}, @@ -50,8 +51,8 @@ func TestRouteCreate(t *testing.T) { if !strings.Contains(resp.Error.Message, test.expectedError.Error()) { t.Log(buf.String()) - t.Errorf("Test %d: Expected error message to have `%s`", - i, test.expectedError.Error()) + t.Errorf("Test %d: Expected error message to have `%s`, but it was `%s`", + i, test.expectedError.Error(), resp.Error.Message) } } } @@ -171,7 +172,6 @@ func TestRouteUpdate(t *testing.T) { // errors {"/v1/apps/a/routes/myroute/do", ``, http.StatusBadRequest, models.ErrInvalidJSON}, {"/v1/apps/a/routes/myroute/do", `{}`, http.StatusBadRequest, models.ErrRoutesMissingNew}, - {"/v1/apps/a/routes/myroute/do", `{ "route": {} }`, http.StatusInternalServerError, models.ErrRoutesValidationMissingImage}, // success {"/v1/apps/a/routes/myroute/do", `{ "route": { "image": "iron/hello", "path": "/myroute" } }`, http.StatusOK, nil}, diff --git a/api/server/routes_update.go b/api/server/routes_update.go index 02a99a424..d86fd3cd5 100644 --- a/api/server/routes_update.go +++ b/api/server/routes_update.go @@ -6,6 +6,7 @@ import ( "github.com/gin-gonic/gin" "github.com/iron-io/functions/api/models" + "github.com/iron-io/functions/api/runner" "github.com/iron-io/runner/common" ) @@ -31,10 +32,14 @@ func handleRouteUpdate(c *gin.Context) { wroute.Route.AppName = c.Param("app") wroute.Route.Path = c.Param("route") - if err := wroute.Validate(); err != nil { - log.Error(err) - c.JSON(http.StatusInternalServerError, simpleError(err)) - return + if wroute.Route.Image != "" { + err = Api.Runner.EnsureImageExists(ctx, &runner.Config{ + Image: wroute.Route.Image, + }) + if err != nil { + c.JSON(http.StatusInternalServerError, simpleError(models.ErrUsableImage)) + return + } } _, err = Api.Datastore.UpdateRoute(wroute.Route)