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)
}
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, "")

View File

@ -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())

View File

@ -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}",

View File

@ -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 {

View File

@ -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}"),

View File

@ -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

View File

@ -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",

View File

@ -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": {

View File

@ -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)