Bug(sqlstore): fix issue with postgres unable to find existing main organization (#73789)

* SQLStore: fix issue where postgres would not find the existing org

Grafana using a postgres databases would fail to find the created org when the CreatedAt and UpdatedAt times are (inaccurately) populated. This issue only occurs in postgres, and only shows up when getOrCreateOrg run to create the admin user AND the organization already exists. See https://github.com/grafana/grafana/issues/71781 for more information and a reproduction.

* add an integration test
This commit is contained in:
Kristin Laemmert 2023-08-30 11:45:20 -04:00 committed by GitHub
parent 1b8e9b51b2
commit 3e272d2bda
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 2 deletions

View File

@ -146,8 +146,6 @@ func verifyExistingOrg(sess *DBSession, orgId int64) error {
func (ss *SQLStore) getOrCreateOrg(sess *DBSession, orgName string) (int64, error) { func (ss *SQLStore) getOrCreateOrg(sess *DBSession, orgName string) (int64, error) {
var org org.Org var org org.Org
org.Created = time.Now()
org.Updated = org.Created
if ss.Cfg.AutoAssignOrg { if ss.Cfg.AutoAssignOrg {
has, err := sess.Where("id=?", ss.Cfg.AutoAssignOrgId).Get(&org) has, err := sess.Where("id=?", ss.Cfg.AutoAssignOrgId).Get(&org)
@ -167,6 +165,8 @@ func (ss *SQLStore) getOrCreateOrg(sess *DBSession, orgName string) (int64, erro
} }
org.Name = mainOrgName org.Name = mainOrgName
org.Created = time.Now()
org.Updated = org.Created
org.ID = int64(ss.Cfg.AutoAssignOrgId) org.ID = int64(ss.Cfg.AutoAssignOrgId)
if err := sess.InsertId(&org, ss.Dialect); err != nil { if err := sess.InsertId(&org, ss.Dialect); err != nil {
ss.log.Error("failed to insert organization with provided id", "org_id", org.ID, "err", err) ss.log.Error("failed to insert organization with provided id", "org_id", org.ID, "err", err)
@ -178,6 +178,8 @@ func (ss *SQLStore) getOrCreateOrg(sess *DBSession, orgName string) (int64, erro
} }
} else { } else {
org.Name = orgName org.Name = orgName
org.Created = time.Now()
org.Updated = org.Created
if _, err := sess.InsertOne(&org); err != nil { if _, err := sess.InsertOne(&org); err != nil {
return 0, err return 0, err
} }

View File

@ -0,0 +1,40 @@
package sqlstore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
)
// testing a regression which shows up when the main org is created, but not the
// admin user: getOrCreateOrg was unable to find the existing org.
// https://github.com/grafana/grafana/issues/71781
func TestIntegrationGetOrCreateOrg(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
ss := InitTestDB(t)
err := ss.WithNewDbSession(context.Background(), func(sess *DBSession) error {
// Create the org only:
ss.Cfg.AutoAssignOrg = true
ss.Cfg.DisableInitAdminCreation = true
ss.Cfg.AutoAssignOrgId = 1
createdOrgID, err := ss.getOrCreateOrg(sess, mainOrgName)
require.NoError(t, err)
require.Equal(t, int64(1), createdOrgID)
return nil
})
require.NoError(t, err)
err = ss.WithNewDbSession(context.Background(), func(sess *DBSession) error {
// Run it a second time and verify that it finds the org that was
// created above.
gotOrgId, err := ss.getOrCreateOrg(sess, mainOrgName)
require.NoError(t, err)
require.Equal(t, int64(1), gotOrgId)
return nil
})
require.NoError(t, err)
}