* Correlations: add migration
* Correlations: Add CreateCorrelation API
* Correlations: Make correlations work with provisioning
* Handle version changes
* Fix lining error
* lint fixes
* rebuild betterer results
* add a UID to each correlation
* Fix lint errors
* add docs
* better wording in API docs
* remove leftover comment
* handle ds updates
* Fix error message typo
* add bad data test
* make correlations a separate table
* skip readonly check when provisioning correlations
* delete stale correlations when datasources are deleted
* restore provisioned readonly ds
* publish deletion event with full data
* generate swagger and HTTP API docs
* apply source datasource permission to create correlation API
* Fix tests & lint errors
* ignore empty deletion events
* fix last lint errors
* fix more lint error
* Only publish deletion event if datasource was actually deleted
* delete DS provisioning deletes correlations, added & fixed tests
* Fix unmarshalling tests
* Fix linting errors
* Fix deltion event tests
* fix small linting error
* fix lint errors
* update betterer
* fix test
* make path singular
* Revert "make path singular"
This reverts commit 420c3d315e.
* add integration tests
* remove unneeded id from correlations table
* update spec
* update leftover references to CorrelationDTO
* fix tests
* cleanup tests
* fix lint error
50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
package correlations
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/grafana/grafana/pkg/api/response"
|
|
"github.com/grafana/grafana/pkg/api/routing"
|
|
"github.com/grafana/grafana/pkg/middleware"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
|
"github.com/grafana/grafana/pkg/services/datasources"
|
|
|
|
"github.com/grafana/grafana/pkg/web"
|
|
)
|
|
|
|
func (s *CorrelationsService) registerAPIEndpoints() {
|
|
uidScope := datasources.ScopeProvider.GetResourceScopeUID(ac.Parameter(":uid"))
|
|
authorize := ac.Middleware(s.AccessControl)
|
|
|
|
s.RouteRegister.Group("/api/datasources/uid/:uid/correlations", func(entities routing.RouteRegister) {
|
|
entities.Post("/", middleware.ReqSignedIn, authorize(ac.ReqOrgAdmin, ac.EvalPermission(datasources.ActionWrite, uidScope)), routing.Wrap(s.createHandler))
|
|
})
|
|
}
|
|
|
|
// createHandler handles POST /datasources/uid/:uid/correlations
|
|
func (s *CorrelationsService) createHandler(c *models.ReqContext) response.Response {
|
|
cmd := CreateCorrelationCommand{}
|
|
if err := web.Bind(c.Req, &cmd); err != nil {
|
|
return response.Error(http.StatusBadRequest, "bad request data", err)
|
|
}
|
|
cmd.SourceUID = web.Params(c.Req)[":uid"]
|
|
cmd.OrgId = c.OrgId
|
|
|
|
correlation, err := s.CreateCorrelation(c.Req.Context(), cmd)
|
|
if err != nil {
|
|
if errors.Is(err, ErrSourceDataSourceDoesNotExists) || errors.Is(err, ErrTargetDataSourceDoesNotExists) {
|
|
return response.Error(http.StatusNotFound, "Data source not found", err)
|
|
}
|
|
|
|
if errors.Is(err, ErrSourceDataSourceReadOnly) {
|
|
return response.Error(http.StatusForbidden, "Data source is read only", err)
|
|
}
|
|
|
|
return response.Error(http.StatusInternalServerError, "Failed to add correlation", err)
|
|
}
|
|
|
|
return response.JSON(http.StatusOK, CreateCorrelationResponse{Result: correlation, Message: "Correlation created"})
|
|
}
|