mirror of https://github.com/portainer/portainer
feat(transactions): remove the feature flag EE-6080 (#10257)
parent
e83aa4d88d
commit
c748385879
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -29,14 +28,9 @@ func (handler *Handler) edgeGroupDelete(w http.ResponseWriter, r *http.Request)
|
||||||
return httperror.BadRequest("Invalid Edge group identifier route variable", err)
|
return httperror.BadRequest("Invalid Edge group identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = deleteEdgeGroup(handler.DataStore, portainer.EdgeGroupID(edgeGroupID))
|
return deleteEdgeGroup(tx, portainer.EdgeGroupID(edgeGroupID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return deleteEdgeGroup(tx, portainer.EdgeGroupID(edgeGroupID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
)
|
)
|
||||||
|
@ -29,14 +28,10 @@ func (handler *Handler) edgeGroupInspect(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
|
|
||||||
var edgeGroup *portainer.EdgeGroup
|
var edgeGroup *portainer.EdgeGroup
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
||||||
edgeGroup, err = getEdgeGroup(handler.DataStore, portainer.EdgeGroupID(edgeGroupID))
|
edgeGroup, err = getEdgeGroup(tx, portainer.EdgeGroupID(edgeGroupID))
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
edgeGroup, err = getEdgeGroup(tx, portainer.EdgeGroupID(edgeGroupID))
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, edgeGroup, err)
|
return txResponse(w, edgeGroup, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/slices"
|
"github.com/portainer/portainer/api/internal/slices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -33,14 +32,10 @@ func (handler *Handler) edgeGroupList(w http.ResponseWriter, r *http.Request) *h
|
||||||
var decoratedEdgeGroups []decoratedEdgeGroup
|
var decoratedEdgeGroups []decoratedEdgeGroup
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
||||||
decoratedEdgeGroups, err = getEdgeGroupList(handler.DataStore)
|
decoratedEdgeGroups, err = getEdgeGroupList(tx)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
decoratedEdgeGroups, err = getEdgeGroupList(tx)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, decoratedEdgeGroups, err)
|
return txResponse(w, decoratedEdgeGroups, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/api/internal/endpointutils"
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
"github.com/portainer/portainer/api/internal/maps"
|
"github.com/portainer/portainer/api/internal/maps"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
|
|
||||||
|
@ -92,15 +91,11 @@ func (handler *Handler) createEdgeJobFromFileContent(w http.ResponseWriter, r *h
|
||||||
}
|
}
|
||||||
|
|
||||||
var edgeJob *portainer.EdgeJob
|
var edgeJob *portainer.EdgeJob
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
edgeJob, err = handler.createEdgeJob(handler.DataStore, &payload.edgeJobBasePayload, []byte(payload.FileContent))
|
edgeJob, err = handler.createEdgeJob(tx, &payload.edgeJobBasePayload, []byte(payload.FileContent))
|
||||||
} else {
|
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
edgeJob, err = handler.createEdgeJob(tx, &payload.edgeJobBasePayload, []byte(payload.FileContent))
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, edgeJob, err)
|
return txResponse(w, edgeJob, err)
|
||||||
}
|
}
|
||||||
|
@ -201,15 +196,11 @@ func (handler *Handler) createEdgeJobFromFile(w http.ResponseWriter, r *http.Req
|
||||||
}
|
}
|
||||||
|
|
||||||
var edgeJob *portainer.EdgeJob
|
var edgeJob *portainer.EdgeJob
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
edgeJob, err = handler.createEdgeJob(handler.DataStore, &payload.edgeJobBasePayload, payload.File)
|
edgeJob, err = handler.createEdgeJob(tx, &payload.edgeJobBasePayload, payload.File)
|
||||||
} else {
|
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
edgeJob, err = handler.createEdgeJob(tx, &payload.edgeJobBasePayload, payload.File)
|
|
||||||
|
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, edgeJob, err)
|
return txResponse(w, edgeJob, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/api/internal/maps"
|
"github.com/portainer/portainer/api/internal/maps"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -34,14 +33,9 @@ func (handler *Handler) edgeJobDelete(w http.ResponseWriter, r *http.Request) *h
|
||||||
return httperror.BadRequest("Invalid Edge job identifier route variable", err)
|
return httperror.BadRequest("Invalid Edge job identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.deleteEdgeJob(handler.DataStore, portainer.EdgeJobID(edgeJobID))
|
return handler.deleteEdgeJob(tx, portainer.EdgeJobID(edgeJobID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.deleteEdgeJob(tx, portainer.EdgeJobID(edgeJobID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var handlerError *httperror.HandlerError
|
var handlerError *httperror.HandlerError
|
||||||
if errors.As(err, &handlerError) {
|
if errors.As(err, &handlerError) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/api/internal/slices"
|
"github.com/portainer/portainer/api/internal/slices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -54,27 +53,15 @@ func (handler *Handler) edgeJobTasksClear(w http.ResponseWriter, r *http.Request
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
|
|
||||||
updateEdgeJobFn := func(edgeJob *portainer.EdgeJob, endpointID portainer.EndpointID, endpointsFromGroups []portainer.EndpointID) error {
|
updateEdgeJobFn := func(edgeJob *portainer.EdgeJob, endpointID portainer.EndpointID, endpointsFromGroups []portainer.EndpointID) error {
|
||||||
return handler.DataStore.EdgeJob().UpdateEdgeJobFunc(edgeJob.ID, func(j *portainer.EdgeJob) {
|
mutationFn(edgeJob, endpointID, endpointsFromGroups)
|
||||||
mutationFn(j, endpointID, endpointsFromGroups)
|
|
||||||
})
|
return tx.EdgeJob().Update(edgeJob.ID, edgeJob)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = handler.clearEdgeJobTaskLogs(handler.DataStore, portainer.EdgeJobID(edgeJobID), portainer.EndpointID(taskID), updateEdgeJobFn)
|
return handler.clearEdgeJobTaskLogs(tx, portainer.EdgeJobID(edgeJobID), portainer.EndpointID(taskID), updateEdgeJobFn)
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
updateEdgeJobFn := func(edgeJob *portainer.EdgeJob, endpointID portainer.EndpointID, endpointsFromGroups []portainer.EndpointID) error {
|
|
||||||
mutationFn(edgeJob, endpointID, endpointsFromGroups)
|
|
||||||
|
|
||||||
return tx.EdgeJob().Update(edgeJob.ID, edgeJob)
|
|
||||||
}
|
|
||||||
|
|
||||||
return handler.clearEdgeJobTaskLogs(tx, portainer.EdgeJobID(edgeJobID), portainer.EndpointID(taskID), updateEdgeJobFn)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var handlerError *httperror.HandlerError
|
var handlerError *httperror.HandlerError
|
||||||
if errors.As(err, &handlerError) {
|
if errors.As(err, &handlerError) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/api/internal/maps"
|
"github.com/portainer/portainer/api/internal/maps"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
)
|
)
|
||||||
|
@ -39,14 +38,10 @@ func (handler *Handler) edgeJobTasksList(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
|
|
||||||
var tasks []taskContainer
|
var tasks []taskContainer
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
tasks, err = listEdgeJobTasks(handler.DataStore, portainer.EdgeJobID(edgeJobID))
|
tasks, err = listEdgeJobTasks(tx, portainer.EdgeJobID(edgeJobID))
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
tasks, err = listEdgeJobTasks(tx, portainer.EdgeJobID(edgeJobID))
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, tasks, err)
|
return txResponse(w, tasks, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/internal/endpointutils"
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
"github.com/portainer/portainer/api/internal/maps"
|
"github.com/portainer/portainer/api/internal/maps"
|
||||||
"github.com/portainer/portainer/api/internal/slices"
|
"github.com/portainer/portainer/api/internal/slices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
|
|
||||||
|
@ -63,14 +62,10 @@ func (handler *Handler) edgeJobUpdate(w http.ResponseWriter, r *http.Request) *h
|
||||||
}
|
}
|
||||||
|
|
||||||
var edgeJob *portainer.EdgeJob
|
var edgeJob *portainer.EdgeJob
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
edgeJob, err = handler.updateEdgeJob(handler.DataStore, portainer.EdgeJobID(edgeJobID), payload)
|
edgeJob, err = handler.updateEdgeJob(tx, portainer.EdgeJobID(edgeJobID), payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
edgeJob, err = handler.updateEdgeJob(tx, portainer.EdgeJobID(edgeJobID), payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, edgeJob, err)
|
return txResponse(w, edgeJob, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
httperrors "github.com/portainer/portainer/api/http/errors"
|
httperrors "github.com/portainer/portainer/api/http/errors"
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -26,14 +25,10 @@ func (handler *Handler) edgeStackCreate(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
|
|
||||||
var edgeStack *portainer.EdgeStack
|
var edgeStack *portainer.EdgeStack
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
edgeStack, err = handler.createSwarmStack(handler.DataStore, method, dryrun, tokenData.ID, r)
|
edgeStack, err = handler.createSwarmStack(tx, method, dryrun, tokenData.ID, r)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
edgeStack, err = handler.createSwarmStack(tx, method, dryrun, tokenData.ID, r)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch {
|
switch {
|
||||||
case httperrors.IsInvalidPayloadError(err):
|
case httperrors.IsInvalidPayloadError(err):
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -30,14 +29,9 @@ func (handler *Handler) edgeStackDelete(w http.ResponseWriter, r *http.Request)
|
||||||
return httperror.BadRequest("Invalid edge stack identifier route variable", err)
|
return httperror.BadRequest("Invalid edge stack identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.deleteEdgeStack(handler.DataStore, portainer.EdgeStackID(edgeStackID))
|
return handler.deleteEdgeStack(tx, portainer.EdgeStackID(edgeStackID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.deleteEdgeStack(tx, portainer.EdgeStackID(edgeStackID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/http/middlewares"
|
"github.com/portainer/portainer/api/http/middlewares"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -45,14 +44,10 @@ func (handler *Handler) edgeStackStatusDelete(w http.ResponseWriter, r *http.Req
|
||||||
}
|
}
|
||||||
|
|
||||||
var stack *portainer.EdgeStack
|
var stack *portainer.EdgeStack
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
stack, err = handler.deleteEdgeStackStatus(handler.DataStore, portainer.EdgeStackID(stackID), endpoint)
|
stack, err = handler.deleteEdgeStackStatus(tx, portainer.EdgeStackID(stackID), endpoint)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
stack, err = handler.deleteEdgeStackStatus(tx, portainer.EdgeStackID(stackID), endpoint)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -70,15 +69,10 @@ func (handler *Handler) edgeStackStatusUpdate(w http.ResponseWriter, r *http.Req
|
||||||
}
|
}
|
||||||
|
|
||||||
var stack *portainer.EdgeStack
|
var stack *portainer.EdgeStack
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
stack, err = handler.updateEdgeStackStatus(handler.DataStore, r, portainer.EdgeStackID(stackID), payload)
|
stack, err = handler.updateEdgeStackStatus(tx, r, portainer.EdgeStackID(stackID), payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
stack, err = handler.updateEdgeStackStatus(tx, r, portainer.EdgeStackID(stackID), payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
@ -130,22 +124,11 @@ func (handler *Handler) updateEdgeStackStatus(tx dataservices.DataStoreTx, r *ht
|
||||||
Time: payload.Time,
|
Time: payload.Time,
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
updateEnvStatus(payload.EndpointID, stack, deploymentStatus)
|
||||||
err = tx.EdgeStack().UpdateEdgeStackFunc(stackID, func(edgeStack *portainer.EdgeStack) {
|
|
||||||
updateEnvStatus(payload.EndpointID, edgeStack, deploymentStatus)
|
|
||||||
|
|
||||||
stack = edgeStack
|
err = tx.EdgeStack().UpdateEdgeStack(stackID, stack)
|
||||||
})
|
if err != nil {
|
||||||
if err != nil {
|
return nil, handler.handlerDBErr(err, "Unable to persist the stack changes inside the database")
|
||||||
return nil, handler.handlerDBErr(err, "Unable to persist the stack changes inside the database")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
updateEnvStatus(payload.EndpointID, stack, deploymentStatus)
|
|
||||||
|
|
||||||
err = tx.EdgeStack().UpdateEdgeStack(stackID, stack)
|
|
||||||
if err != nil {
|
|
||||||
return nil, handler.handlerDBErr(err, "Unable to persist the stack changes inside the database")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return stack, nil
|
return stack, nil
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/api/internal/set"
|
"github.com/portainer/portainer/api/internal/set"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -65,15 +64,10 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
|
|
||||||
var stack *portainer.EdgeStack
|
var stack *portainer.EdgeStack
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
stack, err = handler.updateEdgeStack(handler.DataStore, portainer.EdgeStackID(stackID), payload)
|
stack, err = handler.updateEdgeStack(tx, portainer.EdgeStackID(stackID), payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
stack, err = handler.updateEdgeStack(tx, portainer.EdgeStackID(stackID), payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/http/middlewares"
|
"github.com/portainer/portainer/api/http/middlewares"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -56,14 +55,9 @@ func (handler *Handler) endpointEdgeJobsLogs(w http.ResponseWriter, r *http.Requ
|
||||||
return httperror.BadRequest("Invalid request payload", err)
|
return httperror.BadRequest("Invalid request payload", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.getEdgeJobLobs(handler.DataStore, endpoint.ID, portainer.EdgeJobID(edgeJobID), payload)
|
return handler.getEdgeJobLobs(tx, endpoint.ID, portainer.EdgeJobID(edgeJobID), payload)
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.getEdgeJobLobs(tx, endpoint.ID, portainer.EdgeJobID(edgeJobID), payload)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -16,7 +16,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge/cache"
|
"github.com/portainer/portainer/api/internal/edge/cache"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -106,15 +105,10 @@ func (handler *Handler) endpointEdgeStatusInspect(w http.ResponseWriter, r *http
|
||||||
}
|
}
|
||||||
|
|
||||||
var statusResponse *endpointEdgeStatusInspectResponse
|
var statusResponse *endpointEdgeStatusInspectResponse
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
statusResponse, err = handler.inspectStatus(handler.DataStore, r, portainer.EndpointID(endpointID))
|
statusResponse, err = handler.inspectStatus(tx, r, portainer.EndpointID(endpointID))
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
statusResponse, err = handler.inspectStatus(tx, r, portainer.EndpointID(endpointID))
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -58,15 +57,10 @@ func (handler *Handler) endpointGroupCreate(w http.ResponseWriter, r *http.Reque
|
||||||
}
|
}
|
||||||
|
|
||||||
var endpointGroup *portainer.EndpointGroup
|
var endpointGroup *portainer.EndpointGroup
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
endpointGroup, err = handler.createEndpointGroup(handler.DataStore, payload)
|
endpointGroup, err = handler.createEndpointGroup(tx, payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
endpointGroup, err = handler.createEndpointGroup(tx, payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
@ -119,20 +113,6 @@ func (handler *Handler) createEndpointGroup(tx dataservices.DataStoreTx, payload
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tagID := range endpointGroup.TagIDs {
|
for _, tagID := range endpointGroup.TagIDs {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
|
||||||
err = tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
|
||||||
tag.EndpointGroups[endpointGroup.ID] = true
|
|
||||||
})
|
|
||||||
|
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, httperror.InternalServerError("Unable to persist tag changes inside the database", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
tag, err := tx.Tag().Read(tagID)
|
tag, err := tx.Tag().Read(tagID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -35,14 +34,9 @@ func (handler *Handler) endpointGroupDelete(w http.ResponseWriter, r *http.Reque
|
||||||
return httperror.Forbidden("Unable to remove the default 'Unassigned' group", errors.New("Cannot remove the default environment group"))
|
return httperror.Forbidden("Unable to remove the default 'Unassigned' group", errors.New("Cannot remove the default environment group"))
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.deleteEndpointGroup(handler.DataStore, portainer.EndpointGroupID(endpointGroupID))
|
return handler.deleteEndpointGroup(tx, portainer.EndpointGroupID(endpointGroupID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.deleteEndpointGroup(tx, portainer.EndpointGroupID(endpointGroupID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
@ -89,20 +83,6 @@ func (handler *Handler) deleteEndpointGroup(tx dataservices.DataStoreTx, endpoin
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tagID := range endpointGroup.TagIDs {
|
for _, tagID := range endpointGroup.TagIDs {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
|
||||||
err = tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
|
||||||
delete(tag.EndpointGroups, endpointGroup.ID)
|
|
||||||
})
|
|
||||||
|
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
return httperror.InternalServerError("Unable to find a tag inside the database", err)
|
|
||||||
} else if err != nil {
|
|
||||||
return httperror.InternalServerError("Unable to persist tag changes inside the database", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
tag, err := tx.Tag().Read(tagID)
|
tag, err := tx.Tag().Read(tagID)
|
||||||
if tx.IsErrObjectNotFound(err) {
|
if tx.IsErrObjectNotFound(err) {
|
||||||
return httperror.InternalServerError("Unable to find a tag inside the database", err)
|
return httperror.InternalServerError("Unable to find a tag inside the database", err)
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -37,14 +36,9 @@ func (handler *Handler) endpointGroupAddEndpoint(w http.ResponseWriter, r *http.
|
||||||
return httperror.BadRequest("Invalid environment identifier route variable", err)
|
return httperror.BadRequest("Invalid environment identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.addEndpoint(handler.DataStore, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
return handler.addEndpoint(tx, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.addEndpoint(tx, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -36,14 +35,9 @@ func (handler *Handler) endpointGroupDeleteEndpoint(w http.ResponseWriter, r *ht
|
||||||
return httperror.BadRequest("Invalid environment identifier route variable", err)
|
return httperror.BadRequest("Invalid environment identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.removeEndpoint(handler.DataStore, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
return handler.removeEndpoint(tx, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.removeEndpoint(tx, portainer.EndpointGroupID(endpointGroupID), portainer.EndpointID(endpointID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/http/utils"
|
"github.com/portainer/portainer/api/http/utils"
|
||||||
"github.com/portainer/portainer/api/internal/tag"
|
"github.com/portainer/portainer/api/internal/tag"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -60,15 +59,10 @@ func (handler *Handler) endpointGroupUpdate(w http.ResponseWriter, r *http.Reque
|
||||||
}
|
}
|
||||||
|
|
||||||
var endpointGroup *portainer.EndpointGroup
|
var endpointGroup *portainer.EndpointGroup
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
endpointGroup, err = handler.updateEndpointGroup(handler.DataStore, portainer.EndpointGroupID(endpointGroupID), payload)
|
endpointGroup, err = handler.updateEndpointGroup(tx, portainer.EndpointGroupID(endpointGroupID), payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
endpointGroup, err = handler.updateEndpointGroup(tx, portainer.EndpointGroupID(endpointGroupID), payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
@ -109,20 +103,6 @@ func (handler *Handler) updateEndpointGroup(tx dataservices.DataStoreTx, endpoin
|
||||||
removeTags := tag.Difference(endpointGroupTagSet, payloadTagSet)
|
removeTags := tag.Difference(endpointGroupTagSet, payloadTagSet)
|
||||||
|
|
||||||
for tagID := range removeTags {
|
for tagID := range removeTags {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
|
||||||
err = tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
|
||||||
delete(tag.EndpointGroups, endpointGroup.ID)
|
|
||||||
})
|
|
||||||
|
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, httperror.InternalServerError("Unable to persist tag changes inside the database", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
tag, err := tx.Tag().Read(tagID)
|
tag, err := tx.Tag().Read(tagID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
||||||
|
@ -138,20 +118,6 @@ func (handler *Handler) updateEndpointGroup(tx dataservices.DataStoreTx, endpoin
|
||||||
|
|
||||||
endpointGroup.TagIDs = payload.TagIDs
|
endpointGroup.TagIDs = payload.TagIDs
|
||||||
for _, tagID := range payload.TagIDs {
|
for _, tagID := range payload.TagIDs {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
|
||||||
err = tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
|
||||||
tag.EndpointGroups[endpointGroup.ID] = true
|
|
||||||
})
|
|
||||||
|
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
|
||||||
} else if err != nil {
|
|
||||||
return nil, httperror.InternalServerError("Unable to persist tag changes inside the database", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
tag, err := tx.Tag().Read(tagID)
|
tag, err := tx.Tag().Read(tagID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
return nil, httperror.InternalServerError("Unable to find a tag inside the database", err)
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
httperrors "github.com/portainer/portainer/api/http/errors"
|
httperrors "github.com/portainer/portainer/api/http/errors"
|
||||||
"github.com/portainer/portainer/api/internal/endpointutils"
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -47,14 +46,9 @@ func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *
|
||||||
return httperror.Forbidden(httperrors.ErrNotAvailableInDemo.Error(), httperrors.ErrNotAvailableInDemo)
|
return httperror.Forbidden(httperrors.ErrNotAvailableInDemo.Error(), httperrors.ErrNotAvailableInDemo)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.deleteEndpoint(handler.DataStore, portainer.EndpointID(endpointID), deleteCluster)
|
return handler.deleteEndpoint(tx, portainer.EndpointID(endpointID), deleteCluster)
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.deleteEndpoint(tx, portainer.EndpointID(endpointID), deleteCluster)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var handlerError *httperror.HandlerError
|
var handlerError *httperror.HandlerError
|
||||||
if errors.As(err, &handlerError) {
|
if errors.As(err, &handlerError) {
|
||||||
|
@ -103,17 +97,11 @@ func (handler *Handler) deleteEndpoint(tx dataservices.DataStoreTx, endpointID p
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tagID := range endpoint.TagIDs {
|
for _, tagID := range endpoint.TagIDs {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
var tag *portainer.Tag
|
||||||
err = handler.DataStore.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
tag, err = tx.Tag().Read(tagID)
|
||||||
delete(tag.Endpoints, endpoint.ID)
|
if err == nil {
|
||||||
})
|
delete(tag.Endpoints, endpoint.ID)
|
||||||
} else {
|
err = tx.Tag().Update(tagID, tag)
|
||||||
var tag *portainer.Tag
|
|
||||||
tag, err = tx.Tag().Read(tagID)
|
|
||||||
if err == nil {
|
|
||||||
delete(tag.Endpoints, endpoint.ID)
|
|
||||||
err = tx.Tag().Update(tagID, tag)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if handler.DataStore.IsErrObjectNotFound(err) {
|
if handler.DataStore.IsErrObjectNotFound(err) {
|
||||||
|
@ -129,14 +117,8 @@ func (handler *Handler) deleteEndpoint(tx dataservices.DataStoreTx, endpointID p
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, edgeGroup := range edgeGroups {
|
for _, edgeGroup := range edgeGroups {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
edgeGroup.Endpoints = removeElement(edgeGroup.Endpoints, endpoint.ID)
|
||||||
err = handler.DataStore.EdgeGroup().UpdateEdgeGroupFunc(edgeGroup.ID, func(g *portainer.EdgeGroup) {
|
tx.EdgeGroup().Update(edgeGroup.ID, &edgeGroup)
|
||||||
g.Endpoints = removeElement(g.Endpoints, endpoint.ID)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
edgeGroup.Endpoints = removeElement(edgeGroup.Endpoints, endpoint.ID)
|
|
||||||
tx.EdgeGroup().Update(edgeGroup.ID, &edgeGroup)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn().Err(err).Msgf("Unable to update edge group")
|
log.Warn().Err(err).Msgf("Unable to update edge group")
|
||||||
|
@ -184,15 +166,9 @@ func (handler *Handler) deleteEndpoint(tx dataservices.DataStoreTx, endpointID p
|
||||||
for idx := range edgeJobs {
|
for idx := range edgeJobs {
|
||||||
edgeJob := &edgeJobs[idx]
|
edgeJob := &edgeJobs[idx]
|
||||||
if _, ok := edgeJob.Endpoints[endpoint.ID]; ok {
|
if _, ok := edgeJob.Endpoints[endpoint.ID]; ok {
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
delete(edgeJob.Endpoints, endpoint.ID)
|
||||||
err = tx.EdgeJob().UpdateEdgeJobFunc(edgeJob.ID, func(j *portainer.EdgeJob) {
|
|
||||||
delete(j.Endpoints, endpoint.ID)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
delete(edgeJob.Endpoints, endpoint.ID)
|
|
||||||
err = tx.EdgeJob().Update(edgeJob.ID, edgeJob)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
err = tx.EdgeJob().Update(edgeJob.ID, edgeJob)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn().Err(err).Msgf("Unable to update edge job")
|
log.Warn().Err(err).Msgf("Unable to update edge job")
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
"github.com/portainer/portainer/api/internal/endpointutils"
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -35,14 +34,10 @@ func (handler *Handler) endpointRegistriesList(w http.ResponseWriter, r *http.Re
|
||||||
}
|
}
|
||||||
|
|
||||||
var registries []portainer.Registry
|
var registries []portainer.Registry
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
||||||
registries, err = handler.listRegistries(handler.DataStore, r, portainer.EndpointID(endpointID))
|
registries, err = handler.listRegistries(tx, r, portainer.EndpointID(endpointID))
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.ViewTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
registries, err = handler.listRegistries(tx, r, portainer.EndpointID(endpointID))
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -51,14 +50,9 @@ func (handler *Handler) endpointRegistryAccess(w http.ResponseWriter, r *http.Re
|
||||||
return httperror.BadRequest("Invalid registry identifier route variable", err)
|
return httperror.BadRequest("Invalid registry identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = handler.updateRegistryAccess(handler.DataStore, r, portainer.EndpointID(endpointID), portainer.RegistryID(registryID))
|
return handler.updateRegistryAccess(tx, r, portainer.EndpointID(endpointID), portainer.RegistryID(registryID))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return handler.updateRegistryAccess(tx, r, portainer.EndpointID(endpointID), portainer.RegistryID(registryID))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -9,7 +9,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/filesystem"
|
"github.com/portainer/portainer/api/filesystem"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
"github.com/portainer/portainer/pkg/libhelm"
|
"github.com/portainer/portainer/pkg/libhelm"
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
|
@ -120,15 +119,10 @@ func (handler *Handler) settingsUpdate(w http.ResponseWriter, r *http.Request) *
|
||||||
}
|
}
|
||||||
|
|
||||||
var settings *portainer.Settings
|
var settings *portainer.Settings
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
settings, err = handler.updateSettings(handler.DataStore, payload)
|
settings, err = handler.updateSettings(tx, payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
settings, err = handler.updateSettings(tx, payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var httpErr *httperror.HandlerError
|
var httpErr *httperror.HandlerError
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import (
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
|
|
||||||
|
@ -47,14 +46,10 @@ func (handler *Handler) tagCreate(w http.ResponseWriter, r *http.Request) *httpe
|
||||||
}
|
}
|
||||||
|
|
||||||
var tag *portainer.Tag
|
var tag *portainer.Tag
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
tag, err = createTag(handler.DataStore, payload)
|
tag, err = createTag(tx, payload)
|
||||||
} else {
|
return err
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
tag, err = createTag(tx, payload)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return txResponse(w, tag, err)
|
return txResponse(w, tag, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/dataservices"
|
"github.com/portainer/portainer/api/dataservices"
|
||||||
"github.com/portainer/portainer/api/internal/edge"
|
"github.com/portainer/portainer/api/internal/edge"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
httperror "github.com/portainer/portainer/pkg/libhttp/error"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/request"
|
"github.com/portainer/portainer/pkg/libhttp/request"
|
||||||
"github.com/portainer/portainer/pkg/libhttp/response"
|
"github.com/portainer/portainer/pkg/libhttp/response"
|
||||||
|
@ -33,14 +32,9 @@ func (handler *Handler) tagDelete(w http.ResponseWriter, r *http.Request) *httpe
|
||||||
return httperror.BadRequest("Invalid tag identifier route variable", err)
|
return httperror.BadRequest("Invalid tag identifier route variable", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
err = deleteTag(handler.DataStore, portainer.TagID(id))
|
return deleteTag(tx, portainer.TagID(id))
|
||||||
} else {
|
})
|
||||||
err = handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
|
||||||
return deleteTag(tx, portainer.TagID(id))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var handlerError *httperror.HandlerError
|
var handlerError *httperror.HandlerError
|
||||||
if errors.As(err, &handlerError) {
|
if errors.As(err, &handlerError) {
|
||||||
|
@ -111,23 +105,12 @@ func deleteTag(tx dataservices.DataStoreTx, tagID portainer.TagID) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
for _, edgeGroup := range edgeGroups {
|
||||||
for _, edgeGroup := range edgeGroups {
|
edgeGroup.TagIDs = removeElement(edgeGroup.TagIDs, tagID)
|
||||||
err = tx.EdgeGroup().UpdateEdgeGroupFunc(edgeGroup.ID, func(g *portainer.EdgeGroup) {
|
|
||||||
g.TagIDs = removeElement(g.TagIDs, tagID)
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return httperror.InternalServerError("Unable to update edge group", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for _, edgeGroup := range edgeGroups {
|
|
||||||
edgeGroup.TagIDs = removeElement(edgeGroup.TagIDs, tagID)
|
|
||||||
|
|
||||||
err = tx.EdgeGroup().Update(edgeGroup.ID, &edgeGroup)
|
err = tx.EdgeGroup().Update(edgeGroup.ID, &edgeGroup)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return httperror.InternalServerError("Unable to update edge group", err)
|
return httperror.InternalServerError("Unable to update edge group", err)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/utils"
|
"github.com/portainer/portainer/api/http/utils"
|
||||||
"github.com/portainer/portainer/api/internal/authorization"
|
"github.com/portainer/portainer/api/internal/authorization"
|
||||||
"github.com/portainer/portainer/api/internal/endpointutils"
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
"github.com/portainer/portainer/pkg/featureflags"
|
|
||||||
|
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
)
|
)
|
||||||
|
@ -263,14 +262,10 @@ func (service *Service) snapshotEndpoints() error {
|
||||||
|
|
||||||
snapshotError := service.SnapshotEndpoint(&endpoint)
|
snapshotError := service.SnapshotEndpoint(&endpoint)
|
||||||
|
|
||||||
if featureflags.IsEnabled(portainer.FeatureNoTx) {
|
service.dataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
||||||
updateEndpointStatus(service.dataStore, &endpoint, snapshotError)
|
updateEndpointStatus(tx, &endpoint, snapshotError)
|
||||||
} else {
|
return nil
|
||||||
service.dataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
|
})
|
||||||
updateEndpointStatus(tx, &endpoint, snapshotError)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -1616,13 +1616,11 @@ const (
|
||||||
|
|
||||||
// List of supported features
|
// List of supported features
|
||||||
const (
|
const (
|
||||||
FeatureFdo = "fdo"
|
FeatureFdo = "fdo"
|
||||||
FeatureNoTx = "noTx"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var SupportedFeatureFlags = []featureflags.Feature{
|
var SupportedFeatureFlags = []featureflags.Feature{
|
||||||
FeatureFdo,
|
FeatureFdo,
|
||||||
FeatureNoTx,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
Loading…
Reference in New Issue