From 1937f62c0288e4949e36e9eab9b2d8bc8894be46 Mon Sep 17 00:00:00 2001 From: Mihai Doarna Date: Fri, 17 Oct 2025 15:57:10 +0300 Subject: [PATCH] IAM: Run team_member uid migrations on team service startup (#112565) * run uid migrations on team service startup * go mod tidy * make update-workspace * remove logsdrilldown pkg --- pkg/services/team/teamimpl/store.go | 23 +++++++++++++++++++++++ pkg/services/team/teamimpl/team.go | 8 +++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pkg/services/team/teamimpl/store.go b/pkg/services/team/teamimpl/store.go index 6008bd9c1d0..9f3815a259c 100644 --- a/pkg/services/team/teamimpl/store.go +++ b/pkg/services/team/teamimpl/store.go @@ -11,6 +11,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/db" ac "github.com/grafana/grafana/pkg/services/accesscontrol" + "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/services/team" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" @@ -584,3 +585,25 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb func (ss *xormStore) RegisterDelete(query string) { ss.deletes = append(ss.deletes, query) } + +// teamMemberUidMigration ensures that all team members have a valid uid. +// To protect against upgrade / downgrade we need to run this for a couple of releases. +// FIXME: Remove this migration around Q2 2026 +func (ss *xormStore) teamMemberUidMigration() error { + return ss.db.WithDbSession(context.Background(), func(sess *db.Session) error { + switch ss.db.GetDBType() { + case migrator.SQLite: + _, err := sess.Exec("UPDATE team_member SET uid=printf('tm%09d',id) WHERE uid IS NULL OR uid = '';") + return err + case migrator.Postgres: + _, err := sess.Exec("UPDATE team_member SET uid='tm' || lpad('' || id::text,9,'0') WHERE uid IS NULL OR uid = '';") + return err + case migrator.MySQL: + _, err := sess.Exec("UPDATE team_member SET uid=concat('tm',lpad(id,9,'0')) WHERE uid IS NULL OR uid = '';") + return err + default: + // this branch should be unreachable + return nil + } + }) +} diff --git a/pkg/services/team/teamimpl/team.go b/pkg/services/team/teamimpl/team.go index 94fcf6d2186..9961497fa6a 100644 --- a/pkg/services/team/teamimpl/team.go +++ b/pkg/services/team/teamimpl/team.go @@ -25,9 +25,15 @@ type Service struct { } func ProvideService(db db.DB, cfg *setting.Cfg, tracer tracing.Tracer) (team.Service, error) { + store := &xormStore{db: db, cfg: cfg, deletes: []string{}} + + if err := store.teamMemberUidMigration(); err != nil { + return nil, err + } + return &Service{ cache: localcache.New(defaultCacheDuration, 2*defaultCacheDuration), - store: &xormStore{db: db, cfg: cfg, deletes: []string{}}, + store: store, tracer: tracer, }, nil }