diff --git a/api/datastore/migrator/migrate_2_33_0.go b/api/datastore/migrator/migrate_2_33_0.go index f000a780a..83a822cb1 100644 --- a/api/datastore/migrator/migrate_2_33_0.go +++ b/api/datastore/migrator/migrate_2_33_0.go @@ -11,8 +11,10 @@ func (m *Migrator) migrateEdgeGroupEndpointsToRoars_2_33_0() error { } for _, eg := range egs { - eg.EndpointIDs = roar.FromSlice(eg.Endpoints) - eg.Endpoints = nil + if eg.EndpointIDs.Len() == 0 { + eg.EndpointIDs = roar.FromSlice(eg.Endpoints) + eg.Endpoints = nil + } if err := m.edgeGroupService.Update(eg.ID, &eg); err != nil { return err diff --git a/api/datastore/migrator/migrate_2_33_test.go b/api/datastore/migrator/migrate_2_33_test.go new file mode 100644 index 000000000..2b197f54f --- /dev/null +++ b/api/datastore/migrator/migrate_2_33_test.go @@ -0,0 +1,55 @@ +package migrator + +import ( + "testing" + + portainer "github.com/portainer/portainer/api" + "github.com/portainer/portainer/api/database/boltdb" + "github.com/portainer/portainer/api/dataservices/edgegroup" + + "github.com/stretchr/testify/require" +) + +func TestMigrateEdgeGroupEndpointsToRoars_2_33_0Idempotency(t *testing.T) { + var conn portainer.Connection = &boltdb.DbConnection{Path: t.TempDir()} + err := conn.Open() + require.NoError(t, err) + + defer conn.Close() + + edgeGroupService, err := edgegroup.NewService(conn) + require.NoError(t, err) + + edgeGroup := &portainer.EdgeGroup{ + ID: 1, + Name: "test-edge-group", + Endpoints: []portainer.EndpointID{1, 2, 3}, + } + + err = conn.CreateObjectWithId(edgegroup.BucketName, int(edgeGroup.ID), edgeGroup) + require.NoError(t, err) + + m := NewMigrator(&MigratorParameters{EdgeGroupService: edgeGroupService}) + + // Run migration once + + err = m.migrateEdgeGroupEndpointsToRoars_2_33_0() + require.NoError(t, err) + + migratedEdgeGroup, err := edgeGroupService.Read(edgeGroup.ID) + require.NoError(t, err) + + require.Len(t, migratedEdgeGroup.Endpoints, 0) + require.Equal(t, len(edgeGroup.Endpoints), migratedEdgeGroup.EndpointIDs.Len()) + + // Run migration again to ensure the results didn't change + + err = m.migrateEdgeGroupEndpointsToRoars_2_33_0() + require.NoError(t, err) + + migratedEdgeGroup, err = edgeGroupService.Read(edgeGroup.ID) + require.NoError(t, err) + + require.Len(t, migratedEdgeGroup.Endpoints, 0) + require.Equal(t, len(edgeGroup.Endpoints), migratedEdgeGroup.EndpointIDs.Len()) +}