Drop ProvenanceOrgAdapter and build into store API instead (#48137)

This commit is contained in:
Alexander Weaver
2022-04-26 10:30:57 -05:00
committed by GitHub
parent 9b95d77be9
commit 078a578803
9 changed files with 56 additions and 112 deletions

View File

@@ -21,16 +21,15 @@ func (pr provenanceRecord) TableName() string {
}
// GetProvenance gets the provenance status for a provisionable object.
func (st DBstore) GetProvenance(ctx context.Context, o models.Provisionable) (models.Provenance, error) {
func (st DBstore) GetProvenance(ctx context.Context, o models.Provisionable, org int64) (models.Provenance, error) {
recordType := o.ResourceType()
recordKey := o.ResourceID()
orgID := o.ResourceOrgID()
provenance := models.ProvenanceNone
err := st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
filter := "record_key = ? AND record_type = ? AND org_id = ?"
var result models.Provenance
has, err := sess.Table(provenanceRecord{}).Where(filter, recordKey, recordType, orgID).Desc("id").Cols("provenance").Get(&result)
has, err := sess.Table(provenanceRecord{}).Where(filter, recordKey, recordType, org).Desc("id").Cols("provenance").Get(&result)
if err != nil {
return fmt.Errorf("failed to query for existing provenance status: %w", err)
}
@@ -46,11 +45,11 @@ func (st DBstore) GetProvenance(ctx context.Context, o models.Provisionable) (mo
}
// GetProvenance gets the provenance status for a provisionable object.
func (st DBstore) GetProvenances(ctx context.Context, orgID int64, resourceType string) (map[string]models.Provenance, error) {
func (st DBstore) GetProvenances(ctx context.Context, org int64, resourceType string) (map[string]models.Provenance, error) {
resultMap := make(map[string]models.Provenance)
err := st.SQLStore.WithDbSession(ctx, func(sess *sqlstore.DBSession) error {
filter := "record_type = ? AND org_id = ?"
rawData, err := sess.Table(provenanceRecord{}).Where(filter, resourceType, orgID).Desc("id").Cols("record_key", "provenance").QueryString()
rawData, err := sess.Table(provenanceRecord{}).Where(filter, resourceType, org).Desc("id").Cols("record_key", "provenance").QueryString()
if err != nil {
return fmt.Errorf("failed to query for existing provenance status: %w", err)
}
@@ -63,17 +62,16 @@ func (st DBstore) GetProvenances(ctx context.Context, orgID int64, resourceType
}
// SetProvenance changes the provenance status for a provisionable object.
func (st DBstore) SetProvenance(ctx context.Context, o models.Provisionable, p models.Provenance) error {
func (st DBstore) SetProvenance(ctx context.Context, o models.Provisionable, org int64, p models.Provenance) error {
recordType := o.ResourceType()
recordKey := o.ResourceID()
orgID := o.ResourceOrgID()
return st.SQLStore.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
// TODO: Add a unit-of-work pattern, so updating objects + provenance will happen consistently with rollbacks across stores.
// TODO: Need to make sure that writing a record where our concurrency key fails will also fail the whole transaction. That way, this gets rolled back too. can't just check that 0 updates happened inmemory. Check with jp. If not possible, we need our own concurrency key.
// TODO: Clean up stale provenance records periodically.
filter := "record_key = ? AND record_type = ? AND org_id = ?"
_, err := sess.Table(provenanceRecord{}).Where(filter, recordKey, recordType, orgID).Delete(provenanceRecord{})
_, err := sess.Table(provenanceRecord{}).Where(filter, recordKey, recordType, org).Delete(provenanceRecord{})
if err != nil {
return fmt.Errorf("failed to delete pre-existing provisioning status: %w", err)
@@ -83,7 +81,7 @@ func (st DBstore) SetProvenance(ctx context.Context, o models.Provisionable, p m
RecordKey: recordKey,
RecordType: recordType,
Provenance: p,
OrgID: orgID,
OrgID: org,
}
if _, err := sess.Insert(record); err != nil {
@@ -95,12 +93,12 @@ func (st DBstore) SetProvenance(ctx context.Context, o models.Provisionable, p m
}
// DeleteProvenance deletes the provenance record from the table
func (st DBstore) DeleteProvenance(ctx context.Context, o models.Provisionable) error {
func (st DBstore) DeleteProvenance(ctx context.Context, o models.Provisionable, org int64) error {
return st.SQLStore.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error {
_, err := sess.Delete(provenanceRecord{
RecordKey: o.ResourceID(),
RecordType: o.ResourceType(),
OrgID: o.ResourceOrgID(),
OrgID: org,
})
return err
})

View File

@@ -22,7 +22,7 @@ func TestProvisioningStore(t *testing.T) {
UID: "asdf",
}
provenance, err := store.GetProvenance(context.Background(), &rule)
provenance, err := store.GetProvenance(context.Background(), &rule, 1)
require.NoError(t, err)
require.Equal(t, models.ProvenanceNone, provenance)
@@ -32,10 +32,10 @@ func TestProvisioningStore(t *testing.T) {
rule := models.AlertRule{
UID: "123",
}
err := store.SetProvenance(context.Background(), &rule, models.ProvenanceFile)
err := store.SetProvenance(context.Background(), &rule, 1, models.ProvenanceFile)
require.NoError(t, err)
p, err := store.GetProvenance(context.Background(), &rule)
p, err := store.GetProvenance(context.Background(), &rule, 1)
require.NoError(t, err)
require.Equal(t, models.ProvenanceFile, p)
@@ -43,17 +43,15 @@ func TestProvisioningStore(t *testing.T) {
t.Run("Store does not get provenance of record with different org ID", func(t *testing.T) {
ruleOrg2 := models.AlertRule{
UID: "456",
OrgID: 2,
UID: "456",
}
ruleOrg3 := models.AlertRule{
UID: "456",
OrgID: 3,
UID: "456",
}
err := store.SetProvenance(context.Background(), &ruleOrg2, models.ProvenanceFile)
err := store.SetProvenance(context.Background(), &ruleOrg2, 2, models.ProvenanceFile)
require.NoError(t, err)
p, err := store.GetProvenance(context.Background(), &ruleOrg3)
p, err := store.GetProvenance(context.Background(), &ruleOrg3, 3)
require.NoError(t, err)
require.Equal(t, models.ProvenanceNone, p)
@@ -68,42 +66,42 @@ func TestProvisioningStore(t *testing.T) {
UID: "789",
OrgID: 3,
}
err := store.SetProvenance(context.Background(), &ruleOrg2, models.ProvenanceFile)
err := store.SetProvenance(context.Background(), &ruleOrg2, 2, models.ProvenanceFile)
require.NoError(t, err)
err = store.SetProvenance(context.Background(), &ruleOrg3, models.ProvenanceFile)
err = store.SetProvenance(context.Background(), &ruleOrg3, 3, models.ProvenanceFile)
require.NoError(t, err)
err = store.SetProvenance(context.Background(), &ruleOrg2, models.ProvenanceAPI)
err = store.SetProvenance(context.Background(), &ruleOrg2, 2, models.ProvenanceAPI)
require.NoError(t, err)
p, err := store.GetProvenance(context.Background(), &ruleOrg2)
p, err := store.GetProvenance(context.Background(), &ruleOrg2, 2)
require.NoError(t, err)
require.Equal(t, models.ProvenanceAPI, p)
p, err = store.GetProvenance(context.Background(), &ruleOrg3)
p, err = store.GetProvenance(context.Background(), &ruleOrg3, 3)
require.NoError(t, err)
require.Equal(t, models.ProvenanceFile, p)
})
t.Run("Store should return all provenances by type", func(t *testing.T) {
const orgID = 123
ruleOrg1 := models.AlertRule{
rule1 := models.AlertRule{
UID: "789",
OrgID: orgID,
}
ruleOrg2 := models.AlertRule{
rule2 := models.AlertRule{
UID: "790",
OrgID: orgID,
}
err := store.SetProvenance(context.Background(), &ruleOrg1, models.ProvenanceFile)
err := store.SetProvenance(context.Background(), &rule1, orgID, models.ProvenanceFile)
require.NoError(t, err)
err = store.SetProvenance(context.Background(), &ruleOrg2, models.ProvenanceAPI)
err = store.SetProvenance(context.Background(), &rule2, orgID, models.ProvenanceAPI)
require.NoError(t, err)
p, err := store.GetProvenances(context.Background(), orgID, ruleOrg1.ResourceType())
p, err := store.GetProvenances(context.Background(), orgID, rule1.ResourceType())
require.NoError(t, err)
require.Len(t, p, 2)
require.Equal(t, models.ProvenanceFile, p[ruleOrg1.UID])
require.Equal(t, models.ProvenanceAPI, p[ruleOrg2.UID])
require.Equal(t, models.ProvenanceFile, p[rule1.UID])
require.Equal(t, models.ProvenanceAPI, p[rule2.UID])
})
t.Run("Store should delete provenance correctly", func(t *testing.T) {
@@ -112,16 +110,16 @@ func TestProvisioningStore(t *testing.T) {
UID: "7834539",
OrgID: orgID,
}
err := store.SetProvenance(context.Background(), &ruleOrg, models.ProvenanceFile)
err := store.SetProvenance(context.Background(), &ruleOrg, orgID, models.ProvenanceFile)
require.NoError(t, err)
p, err := store.GetProvenance(context.Background(), &ruleOrg)
p, err := store.GetProvenance(context.Background(), &ruleOrg, orgID)
require.NoError(t, err)
require.Equal(t, models.ProvenanceFile, p)
err = store.DeleteProvenance(context.Background(), &ruleOrg)
err = store.DeleteProvenance(context.Background(), &ruleOrg, orgID)
require.NoError(t, err)
p, err = store.GetProvenance(context.Background(), &ruleOrg)
p, err = store.GetProvenance(context.Background(), &ruleOrg, orgID)
require.NoError(t, err)
require.Equal(t, models.ProvenanceNone, p)
})