POST routes to PUT routes (#48828)

This commit is contained in:
Alexander Weaver 2022-05-06 14:33:30 -05:00 committed by GitHub
parent bb66c03f9a
commit 809aa38103
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 48 additions and 46 deletions

View File

@ -53,7 +53,7 @@ func (srv *ProvisioningSrv) RouteGetPolicyTree(c *models.ReqContext) response.Re
return response.JSON(http.StatusOK, policies) 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) err := srv.policies.UpdatePolicyTree(c.Req.Context(), c.OrgId, tree, alerting_models.ProvenanceAPI)
if errors.Is(err, store.ErrNoAlertmanagerConfiguration) { if errors.Is(err, store.ErrNoAlertmanagerConfiguration) {
return ErrResp(http.StatusNotFound, err, "") return ErrResp(http.StatusNotFound, err, "")

View File

@ -26,24 +26,24 @@ func TestProvisioningApi(t *testing.T) {
require.Equal(t, 200, response.Status()) 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() sut := createProvisioningSrvSut()
rc := createTestRequestCtx() rc := createTestRequestCtx()
tree := apimodels.Route{} tree := apimodels.Route{}
response := sut.RoutePostPolicyTree(&rc, tree) response := sut.RoutePutPolicyTree(&rc, tree)
require.Equal(t, 202, response.Status()) require.Equal(t, 202, response.Status())
}) })
t.Run("when new policy tree is invalid", func(t *testing.T) { 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 := createProvisioningSrvSut()
sut.policies = &fakeRejectingNotificationPolicyService{} sut.policies = &fakeRejectingNotificationPolicyService{}
rc := createTestRequestCtx() rc := createTestRequestCtx()
tree := apimodels.Route{} tree := apimodels.Route{}
response := sut.RoutePostPolicyTree(&rc, tree) response := sut.RoutePutPolicyTree(&rc, tree)
require.Equal(t, 400, response.Status()) require.Equal(t, 400, response.Status())
expBody := `{"error":"invalid object specification: invalid policy tree","message":"invalid object specification: invalid policy tree"}` 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") 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 := createProvisioningSrvSut()
sut.policies = &fakeFailingNotificationPolicyService{} sut.policies = &fakeFailingNotificationPolicyService{}
rc := createTestRequestCtx() rc := createTestRequestCtx()
tree := apimodels.Route{} tree := apimodels.Route{}
response := sut.RoutePostPolicyTree(&rc, tree) response := sut.RoutePutPolicyTree(&rc, tree)
require.Equal(t, 500, response.Status()) require.Equal(t, 500, response.Status())
require.NotEmpty(t, response.Body()) require.NotEmpty(t, response.Body())

View File

@ -186,7 +186,7 @@ func (api *API) authorize(method, path string) web.Handler {
http.MethodGet + "/api/provisioning/templates/{name}": http.MethodGet + "/api/provisioning/templates/{name}":
return middleware.ReqSignedIn return middleware.ReqSignedIn
case http.MethodPost + "/api/provisioning/policies", case http.MethodPut + "/api/provisioning/policies",
http.MethodPost + "/api/provisioning/contact-points", http.MethodPost + "/api/provisioning/contact-points",
http.MethodPut + "/api/provisioning/contact-points", http.MethodPut + "/api/provisioning/contact-points",
http.MethodDelete + "/api/provisioning/contact-points/{ID}", http.MethodDelete + "/api/provisioning/contact-points/{ID}",

View File

@ -23,8 +23,8 @@ func (f *ForkedProvisioningApi) forkRouteGetPolicyTree(ctx *models.ReqContext) r
return f.svc.RouteGetPolicyTree(ctx) return f.svc.RouteGetPolicyTree(ctx)
} }
func (f *ForkedProvisioningApi) forkRoutePostPolicyTree(ctx *models.ReqContext, route apimodels.Route) response.Response { func (f *ForkedProvisioningApi) forkRoutePutPolicyTree(ctx *models.ReqContext, route apimodels.Route) response.Response {
return f.svc.RoutePostPolicyTree(ctx, route) return f.svc.RoutePutPolicyTree(ctx, route)
} }
func (f *ForkedProvisioningApi) forkRouteGetContactpoints(ctx *models.ReqContext) response.Response { func (f *ForkedProvisioningApi) forkRouteGetContactpoints(ctx *models.ReqContext) response.Response {

View File

@ -27,8 +27,8 @@ type ProvisioningApiForkingService interface {
RouteGetTemplate(*models.ReqContext) response.Response RouteGetTemplate(*models.ReqContext) response.Response
RouteGetTemplates(*models.ReqContext) response.Response RouteGetTemplates(*models.ReqContext) response.Response
RoutePostContactpoints(*models.ReqContext) response.Response RoutePostContactpoints(*models.ReqContext) response.Response
RoutePostPolicyTree(*models.ReqContext) response.Response
RoutePutContactpoints(*models.ReqContext) response.Response RoutePutContactpoints(*models.ReqContext) response.Response
RoutePutPolicyTree(*models.ReqContext) response.Response
RoutePutTemplate(*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) 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 { func (f *ForkedProvisioningApi) RoutePutContactpoints(ctx *models.ReqContext) response.Response {
conf := apimodels.EmbeddedContactPoint{} conf := apimodels.EmbeddedContactPoint{}
if err := web.Bind(ctx.Req, &conf); err != nil { 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) 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 { func (f *ForkedProvisioningApi) RoutePutTemplate(ctx *models.ReqContext) response.Response {
conf := apimodels.MessageTemplateContent{} conf := apimodels.MessageTemplateContent{}
if err := web.Bind(ctx.Req, &conf); err != nil { if err := web.Bind(ctx.Req, &conf); err != nil {
@ -160,16 +160,6 @@ func (api *API) RegisterProvisioningApiEndpoints(srv ProvisioningApiForkingServi
m, 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( group.Put(
toMacaronPath("/api/provisioning/contact-points"), toMacaronPath("/api/provisioning/contact-points"),
api.authorize(http.MethodPut, "/api/provisioning/contact-points"), api.authorize(http.MethodPut, "/api/provisioning/contact-points"),
@ -180,6 +170,16 @@ func (api *API) RegisterProvisioningApiEndpoints(srv ProvisioningApiForkingServi
m, 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( group.Put(
toMacaronPath("/api/provisioning/templates/{name}"), toMacaronPath("/api/provisioning/templates/{name}"),
api.authorize(http.MethodPut, "/api/provisioning/templates/{name}"), api.authorize(http.MethodPut, "/api/provisioning/templates/{name}"),

View File

@ -8,7 +8,7 @@ package definitions
// 200: Route // 200: Route
// 400: ValidationError // 400: ValidationError
// swagger:route POST /api/provisioning/policies provisioning RoutePostPolicyTree // swagger:route PUT /api/provisioning/policies provisioning RoutePutPolicyTree
// //
// Sets the notification policy tree. // Sets the notification policy tree.
// //
@ -19,7 +19,7 @@ package definitions
// 202: Accepted // 202: Accepted
// 400: ValidationError // 400: ValidationError
// swagger:parameters RoutePostPolicyTree // swagger:parameters RoutePutPolicyTree
type Policytree struct { type Policytree struct {
// in:body // in:body
Body Route Body Route

View File

@ -3569,7 +3569,6 @@
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models" "x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
}, },
"receiver": { "receiver": {
"description": "Receiver receiver",
"properties": { "properties": {
"name": { "name": {
"description": "name", "description": "name",
@ -3580,7 +3579,9 @@
"required": [ "required": [
"name" "name"
], ],
"type": "object" "type": "object",
"x-go-name": "Receiver",
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models"
}, },
"silence": { "silence": {
"description": "Silence silence", "description": "Silence silence",
@ -4927,11 +4928,11 @@
"provisioning" "provisioning"
] ]
}, },
"post": { "put": {
"consumes": [ "consumes": [
"application/json" "application/json"
], ],
"operationId": "RoutePostPolicyTree", "operationId": "RoutePutPolicyTree",
"parameters": [ "parameters": [
{ {
"in": "body", "in": "body",

View File

@ -1250,7 +1250,7 @@
} }
} }
}, },
"post": { "put": {
"consumes": [ "consumes": [
"application/json" "application/json"
], ],
@ -1258,7 +1258,7 @@
"provisioning" "provisioning"
], ],
"summary": "Sets the notification policy tree.", "summary": "Sets the notification policy tree.",
"operationId": "RoutePostPolicyTree", "operationId": "RoutePutPolicyTree",
"parameters": [ "parameters": [
{ {
"name": "Body", "name": "Body",
@ -5555,7 +5555,6 @@
"$ref": "#/definitions/postableSilence" "$ref": "#/definitions/postableSilence"
}, },
"receiver": { "receiver": {
"description": "Receiver receiver",
"type": "object", "type": "object",
"required": [ "required": [
"name" "name"
@ -5567,6 +5566,8 @@
"x-go-name": "Name" "x-go-name": "Name"
} }
}, },
"x-go-name": "Receiver",
"x-go-package": "github.com/prometheus/alertmanager/api/v2/models",
"$ref": "#/definitions/receiver" "$ref": "#/definitions/receiver"
}, },
"silence": { "silence": {

View File

@ -96,8 +96,8 @@ func TestProvisioning(t *testing.T) {
require.Equal(t, 200, resp.StatusCode) require.Equal(t, 200, resp.StatusCode)
}) })
t.Run("un-authenticated POST should 401", func(t *testing.T) { t.Run("un-authenticated PUT should 401", func(t *testing.T) {
req := createTestRequest("POST", url, "", body) req := createTestRequest("PUT", url, "", body)
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
@ -106,8 +106,8 @@ func TestProvisioning(t *testing.T) {
require.Equal(t, 401, resp.StatusCode) require.Equal(t, 401, resp.StatusCode)
}) })
t.Run("viewer POST should 403", func(t *testing.T) { t.Run("viewer PUT should 403", func(t *testing.T) {
req := createTestRequest("POST", url, "viewer", body) req := createTestRequest("PUT", url, "viewer", body)
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
@ -116,8 +116,8 @@ func TestProvisioning(t *testing.T) {
require.Equal(t, 403, resp.StatusCode) require.Equal(t, 403, resp.StatusCode)
}) })
t.Run("editor POST should succeed", func(t *testing.T) { t.Run("editor PUT should succeed", func(t *testing.T) {
req := createTestRequest("POST", url, "editor", body) req := createTestRequest("PUT", url, "editor", body)
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)
@ -126,8 +126,8 @@ func TestProvisioning(t *testing.T) {
require.Equal(t, 202, resp.StatusCode) require.Equal(t, 202, resp.StatusCode)
}) })
t.Run("admin POST should succeed", func(t *testing.T) { t.Run("admin PUT should succeed", func(t *testing.T) {
req := createTestRequest("POST", url, "admin", body) req := createTestRequest("PUT", url, "admin", body)
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
require.NoError(t, err) require.NoError(t, err)