From 809aa38103771726aa3a6208a87f8138d6d15ea6 Mon Sep 17 00:00:00 2001 From: Alexander Weaver Date: Fri, 6 May 2022 14:33:30 -0500 Subject: [PATCH] POST routes to PUT routes (#48828) --- pkg/services/ngalert/api/api_provisioning.go | 2 +- .../ngalert/api/api_provisioning_test.go | 12 +++--- pkg/services/ngalert/api/authorization.go | 2 +- .../ngalert/api/forked_provisioning.go | 4 +- .../api/generated_base_api_provisioning.go | 38 +++++++++---------- .../definitions/provisioning_policies.go | 4 +- pkg/services/ngalert/api/tooling/post.json | 9 +++-- pkg/services/ngalert/api/tooling/spec.json | 7 ++-- .../api/alerting/api_provisioning_test.go | 16 ++++---- 9 files changed, 48 insertions(+), 46 deletions(-) diff --git a/pkg/services/ngalert/api/api_provisioning.go b/pkg/services/ngalert/api/api_provisioning.go index a1b2672ec82..2242c76e525 100644 --- a/pkg/services/ngalert/api/api_provisioning.go +++ b/pkg/services/ngalert/api/api_provisioning.go @@ -53,7 +53,7 @@ func (srv *ProvisioningSrv) RouteGetPolicyTree(c *models.ReqContext) response.Re return response.JSON(http.StatusOK, policies) } -func (srv *ProvisioningSrv) RoutePostPolicyTree(c *models.ReqContext, tree apimodels.Route) response.Response { +func (srv *ProvisioningSrv) RoutePutPolicyTree(c *models.ReqContext, tree apimodels.Route) response.Response { err := srv.policies.UpdatePolicyTree(c.Req.Context(), c.OrgId, tree, alerting_models.ProvenanceAPI) if errors.Is(err, store.ErrNoAlertmanagerConfiguration) { return ErrResp(http.StatusNotFound, err, "") diff --git a/pkg/services/ngalert/api/api_provisioning_test.go b/pkg/services/ngalert/api/api_provisioning_test.go index 5eab72ef98b..a72b92b371b 100644 --- a/pkg/services/ngalert/api/api_provisioning_test.go +++ b/pkg/services/ngalert/api/api_provisioning_test.go @@ -26,24 +26,24 @@ func TestProvisioningApi(t *testing.T) { require.Equal(t, 200, response.Status()) }) - t.Run("successful POST policies returns 202", func(t *testing.T) { + t.Run("successful PUT policies returns 202", func(t *testing.T) { sut := createProvisioningSrvSut() rc := createTestRequestCtx() tree := apimodels.Route{} - response := sut.RoutePostPolicyTree(&rc, tree) + response := sut.RoutePutPolicyTree(&rc, tree) require.Equal(t, 202, response.Status()) }) t.Run("when new policy tree is invalid", func(t *testing.T) { - t.Run("POST policies returns 400", func(t *testing.T) { + t.Run("PUT policies returns 400", func(t *testing.T) { sut := createProvisioningSrvSut() sut.policies = &fakeRejectingNotificationPolicyService{} rc := createTestRequestCtx() tree := apimodels.Route{} - response := sut.RoutePostPolicyTree(&rc, tree) + response := sut.RoutePutPolicyTree(&rc, tree) require.Equal(t, 400, response.Status()) expBody := `{"error":"invalid object specification: invalid policy tree","message":"invalid object specification: invalid policy tree"}` @@ -86,13 +86,13 @@ func TestProvisioningApi(t *testing.T) { require.Contains(t, string(response.Body()), "something went wrong") }) - t.Run("POST policies returns 500", func(t *testing.T) { + t.Run("PUT policies returns 500", func(t *testing.T) { sut := createProvisioningSrvSut() sut.policies = &fakeFailingNotificationPolicyService{} rc := createTestRequestCtx() tree := apimodels.Route{} - response := sut.RoutePostPolicyTree(&rc, tree) + response := sut.RoutePutPolicyTree(&rc, tree) require.Equal(t, 500, response.Status()) require.NotEmpty(t, response.Body()) diff --git a/pkg/services/ngalert/api/authorization.go b/pkg/services/ngalert/api/authorization.go index 51c62b3d986..bc5074cb407 100644 --- a/pkg/services/ngalert/api/authorization.go +++ b/pkg/services/ngalert/api/authorization.go @@ -186,7 +186,7 @@ func (api *API) authorize(method, path string) web.Handler { http.MethodGet + "/api/provisioning/templates/{name}": return middleware.ReqSignedIn - case http.MethodPost + "/api/provisioning/policies", + case http.MethodPut + "/api/provisioning/policies", http.MethodPost + "/api/provisioning/contact-points", http.MethodPut + "/api/provisioning/contact-points", http.MethodDelete + "/api/provisioning/contact-points/{ID}", diff --git a/pkg/services/ngalert/api/forked_provisioning.go b/pkg/services/ngalert/api/forked_provisioning.go index 088cfe17e27..fb764005613 100644 --- a/pkg/services/ngalert/api/forked_provisioning.go +++ b/pkg/services/ngalert/api/forked_provisioning.go @@ -23,8 +23,8 @@ func (f *ForkedProvisioningApi) forkRouteGetPolicyTree(ctx *models.ReqContext) r return f.svc.RouteGetPolicyTree(ctx) } -func (f *ForkedProvisioningApi) forkRoutePostPolicyTree(ctx *models.ReqContext, route apimodels.Route) response.Response { - return f.svc.RoutePostPolicyTree(ctx, route) +func (f *ForkedProvisioningApi) forkRoutePutPolicyTree(ctx *models.ReqContext, route apimodels.Route) response.Response { + return f.svc.RoutePutPolicyTree(ctx, route) } func (f *ForkedProvisioningApi) forkRouteGetContactpoints(ctx *models.ReqContext) response.Response { diff --git a/pkg/services/ngalert/api/generated_base_api_provisioning.go b/pkg/services/ngalert/api/generated_base_api_provisioning.go index 81a858f92db..49f62ce24f8 100644 --- a/pkg/services/ngalert/api/generated_base_api_provisioning.go +++ b/pkg/services/ngalert/api/generated_base_api_provisioning.go @@ -27,8 +27,8 @@ type ProvisioningApiForkingService interface { RouteGetTemplate(*models.ReqContext) response.Response RouteGetTemplates(*models.ReqContext) response.Response RoutePostContactpoints(*models.ReqContext) response.Response - RoutePostPolicyTree(*models.ReqContext) response.Response RoutePutContactpoints(*models.ReqContext) response.Response + RoutePutPolicyTree(*models.ReqContext) response.Response RoutePutTemplate(*models.ReqContext) response.Response } @@ -64,14 +64,6 @@ func (f *ForkedProvisioningApi) RoutePostContactpoints(ctx *models.ReqContext) r return f.forkRoutePostContactpoints(ctx, conf) } -func (f *ForkedProvisioningApi) RoutePostPolicyTree(ctx *models.ReqContext) response.Response { - conf := apimodels.Route{} - if err := web.Bind(ctx.Req, &conf); err != nil { - return response.Error(http.StatusBadRequest, "bad request data", err) - } - return f.forkRoutePostPolicyTree(ctx, conf) -} - func (f *ForkedProvisioningApi) RoutePutContactpoints(ctx *models.ReqContext) response.Response { conf := apimodels.EmbeddedContactPoint{} if err := web.Bind(ctx.Req, &conf); err != nil { @@ -80,6 +72,14 @@ func (f *ForkedProvisioningApi) RoutePutContactpoints(ctx *models.ReqContext) re return f.forkRoutePutContactpoints(ctx, conf) } +func (f *ForkedProvisioningApi) RoutePutPolicyTree(ctx *models.ReqContext) response.Response { + conf := apimodels.Route{} + if err := web.Bind(ctx.Req, &conf); err != nil { + return response.Error(http.StatusBadRequest, "bad request data", err) + } + return f.forkRoutePutPolicyTree(ctx, conf) +} + func (f *ForkedProvisioningApi) RoutePutTemplate(ctx *models.ReqContext) response.Response { conf := apimodels.MessageTemplateContent{} if err := web.Bind(ctx.Req, &conf); err != nil { @@ -160,16 +160,6 @@ func (api *API) RegisterProvisioningApiEndpoints(srv ProvisioningApiForkingServi m, ), ) - group.Post( - toMacaronPath("/api/provisioning/policies"), - api.authorize(http.MethodPost, "/api/provisioning/policies"), - metrics.Instrument( - http.MethodPost, - "/api/provisioning/policies", - srv.RoutePostPolicyTree, - m, - ), - ) group.Put( toMacaronPath("/api/provisioning/contact-points"), api.authorize(http.MethodPut, "/api/provisioning/contact-points"), @@ -180,6 +170,16 @@ func (api *API) RegisterProvisioningApiEndpoints(srv ProvisioningApiForkingServi m, ), ) + group.Put( + toMacaronPath("/api/provisioning/policies"), + api.authorize(http.MethodPut, "/api/provisioning/policies"), + metrics.Instrument( + http.MethodPut, + "/api/provisioning/policies", + srv.RoutePutPolicyTree, + m, + ), + ) group.Put( toMacaronPath("/api/provisioning/templates/{name}"), api.authorize(http.MethodPut, "/api/provisioning/templates/{name}"), diff --git a/pkg/services/ngalert/api/tooling/definitions/provisioning_policies.go b/pkg/services/ngalert/api/tooling/definitions/provisioning_policies.go index b2019239b36..e9df6997a9e 100644 --- a/pkg/services/ngalert/api/tooling/definitions/provisioning_policies.go +++ b/pkg/services/ngalert/api/tooling/definitions/provisioning_policies.go @@ -8,7 +8,7 @@ package definitions // 200: Route // 400: ValidationError -// swagger:route POST /api/provisioning/policies provisioning RoutePostPolicyTree +// swagger:route PUT /api/provisioning/policies provisioning RoutePutPolicyTree // // Sets the notification policy tree. // @@ -19,7 +19,7 @@ package definitions // 202: Accepted // 400: ValidationError -// swagger:parameters RoutePostPolicyTree +// swagger:parameters RoutePutPolicyTree type Policytree struct { // in:body Body Route diff --git a/pkg/services/ngalert/api/tooling/post.json b/pkg/services/ngalert/api/tooling/post.json index 14a483eaa66..8d18c5ca645 100644 --- a/pkg/services/ngalert/api/tooling/post.json +++ b/pkg/services/ngalert/api/tooling/post.json @@ -3569,7 +3569,6 @@ "x-go-package": "github.com/prometheus/alertmanager/api/v2/models" }, "receiver": { - "description": "Receiver receiver", "properties": { "name": { "description": "name", @@ -3580,7 +3579,9 @@ "required": [ "name" ], - "type": "object" + "type": "object", + "x-go-name": "Receiver", + "x-go-package": "github.com/prometheus/alertmanager/api/v2/models" }, "silence": { "description": "Silence silence", @@ -4927,11 +4928,11 @@ "provisioning" ] }, - "post": { + "put": { "consumes": [ "application/json" ], - "operationId": "RoutePostPolicyTree", + "operationId": "RoutePutPolicyTree", "parameters": [ { "in": "body", diff --git a/pkg/services/ngalert/api/tooling/spec.json b/pkg/services/ngalert/api/tooling/spec.json index 07f858c16b9..261c9ffef44 100644 --- a/pkg/services/ngalert/api/tooling/spec.json +++ b/pkg/services/ngalert/api/tooling/spec.json @@ -1250,7 +1250,7 @@ } } }, - "post": { + "put": { "consumes": [ "application/json" ], @@ -1258,7 +1258,7 @@ "provisioning" ], "summary": "Sets the notification policy tree.", - "operationId": "RoutePostPolicyTree", + "operationId": "RoutePutPolicyTree", "parameters": [ { "name": "Body", @@ -5555,7 +5555,6 @@ "$ref": "#/definitions/postableSilence" }, "receiver": { - "description": "Receiver receiver", "type": "object", "required": [ "name" @@ -5567,6 +5566,8 @@ "x-go-name": "Name" } }, + "x-go-name": "Receiver", + "x-go-package": "github.com/prometheus/alertmanager/api/v2/models", "$ref": "#/definitions/receiver" }, "silence": { diff --git a/pkg/tests/api/alerting/api_provisioning_test.go b/pkg/tests/api/alerting/api_provisioning_test.go index eb3095ab8cb..27080e7f117 100644 --- a/pkg/tests/api/alerting/api_provisioning_test.go +++ b/pkg/tests/api/alerting/api_provisioning_test.go @@ -96,8 +96,8 @@ func TestProvisioning(t *testing.T) { require.Equal(t, 200, resp.StatusCode) }) - t.Run("un-authenticated POST should 401", func(t *testing.T) { - req := createTestRequest("POST", url, "", body) + t.Run("un-authenticated PUT should 401", func(t *testing.T) { + req := createTestRequest("PUT", url, "", body) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) @@ -106,8 +106,8 @@ func TestProvisioning(t *testing.T) { require.Equal(t, 401, resp.StatusCode) }) - t.Run("viewer POST should 403", func(t *testing.T) { - req := createTestRequest("POST", url, "viewer", body) + t.Run("viewer PUT should 403", func(t *testing.T) { + req := createTestRequest("PUT", url, "viewer", body) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) @@ -116,8 +116,8 @@ func TestProvisioning(t *testing.T) { require.Equal(t, 403, resp.StatusCode) }) - t.Run("editor POST should succeed", func(t *testing.T) { - req := createTestRequest("POST", url, "editor", body) + t.Run("editor PUT should succeed", func(t *testing.T) { + req := createTestRequest("PUT", url, "editor", body) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) @@ -126,8 +126,8 @@ func TestProvisioning(t *testing.T) { require.Equal(t, 202, resp.StatusCode) }) - t.Run("admin POST should succeed", func(t *testing.T) { - req := createTestRequest("POST", url, "admin", body) + t.Run("admin PUT should succeed", func(t *testing.T) { + req := createTestRequest("PUT", url, "admin", body) resp, err := http.DefaultClient.Do(req) require.NoError(t, err)