mirror of
https://github.com/portainer/portainer.git
synced 2025-07-18 21:09:40 +02:00
refactor(edge): init endpoint relation when endpoint is created [BE-11928] (#814)
This commit is contained in:
parent
b43f864511
commit
b6f3682a62
10 changed files with 62 additions and 43 deletions
33
api/datastore/migrator/migrate_2_32_0.go
Normal file
33
api/datastore/migrator/migrate_2_32_0.go
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
package migrator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
portainer "github.com/portainer/portainer/api"
|
||||||
|
perrors "github.com/portainer/portainer/api/dataservices/errors"
|
||||||
|
"github.com/portainer/portainer/api/internal/endpointutils"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (m *Migrator) addEndpointRelationForEdgeAgents_2_32_0() error {
|
||||||
|
endpoints, err := m.endpointService.Endpoints()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, endpoint := range endpoints {
|
||||||
|
if endpointutils.IsEdgeEndpoint(&endpoint) {
|
||||||
|
_, err := m.endpointRelationService.EndpointRelation(endpoint.ID)
|
||||||
|
if err != nil && errors.Is(err, perrors.ErrObjectNotFound) {
|
||||||
|
relation := &portainer.EndpointRelation{
|
||||||
|
EndpointID: endpoint.ID,
|
||||||
|
EdgeStacks: make(map[portainer.EdgeStackID]bool),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := m.endpointRelationService.Create(relation); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -249,6 +249,8 @@ func (m *Migrator) initMigrations() {
|
||||||
|
|
||||||
m.addMigrations("2.31.0", m.migrateEdgeStacksStatuses_2_31_0)
|
m.addMigrations("2.31.0", m.migrateEdgeStacksStatuses_2_31_0)
|
||||||
|
|
||||||
|
m.addMigrations("2.32.0", m.addEndpointRelationForEdgeAgents_2_32_0)
|
||||||
|
|
||||||
// Add new migrations above...
|
// Add new migrations above...
|
||||||
// One function per migration, each versions migration funcs in the same file.
|
// One function per migration, each versions migration funcs in the same file.
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,7 +163,7 @@ func (handler *Handler) edgeGroupUpdate(w http.ResponseWriter, r *http.Request)
|
||||||
|
|
||||||
func (handler *Handler) updateEndpointStacks(tx dataservices.DataStoreTx, endpoint *portainer.Endpoint, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) error {
|
func (handler *Handler) updateEndpointStacks(tx dataservices.DataStoreTx, endpoint *portainer.Endpoint, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) error {
|
||||||
relation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
relation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
||||||
if err != nil && !handler.DataStore.IsErrObjectNotFound(err) {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,12 +179,6 @@ func (handler *Handler) updateEndpointStacks(tx dataservices.DataStoreTx, endpoi
|
||||||
edgeStackSet[edgeStackID] = true
|
edgeStackSet[edgeStackID] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if relation == nil {
|
|
||||||
relation = &portainer.EndpointRelation{
|
|
||||||
EndpointID: endpoint.ID,
|
|
||||||
EdgeStacks: make(map[portainer.EdgeStackID]bool),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
relation.EdgeStacks = edgeStackSet
|
relation.EdgeStacks = edgeStackSet
|
||||||
|
|
||||||
return tx.EndpointRelation().UpdateEndpointRelation(endpoint.ID, relation)
|
return tx.EndpointRelation().UpdateEndpointRelation(endpoint.ID, relation)
|
||||||
|
|
|
@ -264,9 +264,6 @@ func (handler *Handler) buildSchedules(tx dataservices.DataStoreTx, endpointID p
|
||||||
func (handler *Handler) buildEdgeStacks(tx dataservices.DataStoreTx, endpointID portainer.EndpointID) ([]stackStatusResponse, *httperror.HandlerError) {
|
func (handler *Handler) buildEdgeStacks(tx dataservices.DataStoreTx, endpointID portainer.EndpointID) ([]stackStatusResponse, *httperror.HandlerError) {
|
||||||
relation, err := tx.EndpointRelation().EndpointRelation(endpointID)
|
relation, err := tx.EndpointRelation().EndpointRelation(endpointID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
return nil, httperror.InternalServerError("Unable to retrieve relation object from the database", err)
|
return nil, httperror.InternalServerError("Unable to retrieve relation object from the database", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,17 +21,10 @@ func (handler *Handler) updateEndpointRelations(tx dataservices.DataStoreTx, end
|
||||||
}
|
}
|
||||||
|
|
||||||
endpointRelation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
endpointRelation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
||||||
if err != nil && !tx.IsErrObjectNotFound(err) {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if endpointRelation == nil {
|
|
||||||
endpointRelation = &portainer.EndpointRelation{
|
|
||||||
EndpointID: endpoint.ID,
|
|
||||||
EdgeStacks: make(map[portainer.EdgeStackID]bool),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
edgeGroups, err := tx.EdgeGroup().ReadAll()
|
edgeGroups, err := tx.EdgeGroup().ReadAll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -563,6 +563,10 @@ func (handler *Handler) saveEndpointAndUpdateAuthorizations(tx dataservices.Data
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := endpointutils.InitializeEdgeEndpointRelation(endpoint, tx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
for _, tagID := range endpoint.TagIDs {
|
for _, tagID := range endpoint.TagIDs {
|
||||||
if err := tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
if err := tx.Tag().UpdateTagFunc(tagID, func(tag *portainer.Tag) {
|
||||||
tag.Endpoints[endpoint.ID] = true
|
tag.Endpoints[endpoint.ID] = true
|
||||||
|
|
|
@ -17,17 +17,7 @@ func (handler *Handler) updateEdgeRelations(tx dataservices.DataStoreTx, endpoin
|
||||||
|
|
||||||
relation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
relation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !tx.IsErrObjectNotFound(err) {
|
return errors.WithMessage(err, "Unable to retrieve environment relation inside the database")
|
||||||
return errors.WithMessage(err, "Unable to retrieve environment relation inside the database")
|
|
||||||
}
|
|
||||||
|
|
||||||
relation = &portainer.EndpointRelation{
|
|
||||||
EndpointID: endpoint.ID,
|
|
||||||
EdgeStacks: map[portainer.EdgeStackID]bool{},
|
|
||||||
}
|
|
||||||
if err := tx.EndpointRelation().Create(relation); err != nil {
|
|
||||||
return errors.WithMessage(err, "Unable to create environment relation inside the database")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
endpointGroup, err := tx.EndpointGroup().Read(endpoint.GroupID)
|
endpointGroup, err := tx.EndpointGroup().Read(endpoint.GroupID)
|
||||||
|
|
|
@ -8,6 +8,7 @@ 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/api/internal/endpointutils"
|
||||||
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"
|
||||||
|
@ -104,9 +105,8 @@ func deleteTag(tx dataservices.DataStoreTx, tagID portainer.TagID) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, endpoint := range endpoints {
|
for _, endpoint := range endpoints {
|
||||||
if (tag.Endpoints[endpoint.ID] || tag.EndpointGroups[endpoint.GroupID]) && (endpoint.Type == portainer.EdgeAgentOnDockerEnvironment || endpoint.Type == portainer.EdgeAgentOnKubernetesEnvironment) {
|
if (tag.Endpoints[endpoint.ID] || tag.EndpointGroups[endpoint.GroupID]) && endpointutils.IsEdgeEndpoint(&endpoint) {
|
||||||
err = updateEndpointRelations(tx, endpoint, edgeGroups, edgeStacks)
|
if err := updateEndpointRelations(tx, endpoint, edgeGroups, edgeStacks); err != nil {
|
||||||
if err != nil {
|
|
||||||
return httperror.InternalServerError("Unable to update environment relations in the database", err)
|
return httperror.InternalServerError("Unable to update environment relations in the database", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -133,17 +133,10 @@ func deleteTag(tx dataservices.DataStoreTx, tagID portainer.TagID) error {
|
||||||
|
|
||||||
func updateEndpointRelations(tx dataservices.DataStoreTx, endpoint portainer.Endpoint, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) error {
|
func updateEndpointRelations(tx dataservices.DataStoreTx, endpoint portainer.Endpoint, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) error {
|
||||||
endpointRelation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
endpointRelation, err := tx.EndpointRelation().EndpointRelation(endpoint.ID)
|
||||||
if err != nil && !tx.IsErrObjectNotFound(err) {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if endpointRelation == nil {
|
|
||||||
endpointRelation = &portainer.EndpointRelation{
|
|
||||||
EndpointID: endpoint.ID,
|
|
||||||
EdgeStacks: make(map[portainer.EdgeStackID]bool),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
endpointGroup, err := tx.EndpointGroup().Read(endpoint.GroupID)
|
endpointGroup, err := tx.EndpointGroup().Read(endpoint.GroupID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -129,9 +129,6 @@ func (service *Service) updateEndpointRelations(tx dataservices.DataStoreTx, edg
|
||||||
for _, endpointID := range relatedEndpointIds {
|
for _, endpointID := range relatedEndpointIds {
|
||||||
relation, err := endpointRelationService.EndpointRelation(endpointID)
|
relation, err := endpointRelationService.EndpointRelation(endpointID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if tx.IsErrObjectNotFound(err) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return fmt.Errorf("unable to find endpoint relation in database: %w", err)
|
return fmt.Errorf("unable to find endpoint relation in database: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,3 +249,19 @@ func getEndpointCheckinInterval(endpoint *portainer.Endpoint, settings *portaine
|
||||||
|
|
||||||
return defaultInterval
|
return defaultInterval
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func InitializeEdgeEndpointRelation(endpoint *portainer.Endpoint, tx dataservices.DataStoreTx) error {
|
||||||
|
if !IsEdgeEndpoint(endpoint) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
relation := &portainer.EndpointRelation{
|
||||||
|
EndpointID: endpoint.ID,
|
||||||
|
EdgeStacks: make(map[portainer.EdgeStackID]bool),
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := tx.EndpointRelation().Create(relation); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue