ServiceAccounts: Collect usage stat for service account forced expiry (#64833)

collect usage stat for service account forced expiry
This commit is contained in:
Jo
2023-03-16 16:36:31 +01:00
committed by GitHub
parent 7784782512
commit 0e565a2e6c
5 changed files with 28 additions and 12 deletions
@@ -25,5 +25,7 @@ func (s *ServiceAccountsStoreImpl) GetUsageMetrics(ctx context.Context) (*servic
return nil, err return nil, err
} }
sqlStats.ForcedExpiryEnabled = s.cfg.SATokenExpirationDayLimit != 0
return &sqlStats, nil return &sqlStats, nil
} }
@@ -7,18 +7,20 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/components/apikeygen" apikeygenprefix "github.com/grafana/grafana/pkg/components/apikeygenprefixed"
"github.com/grafana/grafana/pkg/services/serviceaccounts" "github.com/grafana/grafana/pkg/services/serviceaccounts"
"github.com/grafana/grafana/pkg/services/serviceaccounts/tests" "github.com/grafana/grafana/pkg/services/serviceaccounts/tests"
) )
func TestStore_UsageStats(t *testing.T) { func TestIntegrationStore_UsageStats(t *testing.T) {
saToCreate := tests.TestUser{Login: "servicetestwithTeam@admin", IsServiceAccount: true} saToCreate := tests.TestUser{Login: "servicetestwithTeam@admin", IsServiceAccount: true}
db, store := setupTestDatabase(t) db, store := setupTestDatabase(t)
sa := tests.SetupUserServiceAccount(t, db, saToCreate) sa := tests.SetupUserServiceAccount(t, db, saToCreate)
db.Cfg.SATokenExpirationDayLimit = 4
keyName := t.Name() keyName := t.Name()
key, err := apikeygen.New(sa.OrgID, keyName) key, err := apikeygenprefix.New(keyName)
require.NoError(t, err) require.NoError(t, err)
cmd := serviceaccounts.AddServiceAccountTokenCommand{ cmd := serviceaccounts.AddServiceAccountTokenCommand{
@@ -36,4 +38,5 @@ func TestStore_UsageStats(t *testing.T) {
assert.Equal(t, int64(1), stats.ServiceAccounts) assert.Equal(t, int64(1), stats.ServiceAccounts)
assert.Equal(t, int64(1), stats.Tokens) assert.Equal(t, int64(1), stats.Tokens)
assert.Equal(t, true, stats.ForcedExpiryEnabled)
} }
+12 -5
View File
@@ -42,13 +42,20 @@ func init() {
func (sa *ServiceAccountsService) getUsageMetrics(ctx context.Context) (map[string]interface{}, error) { func (sa *ServiceAccountsService) getUsageMetrics(ctx context.Context) (map[string]interface{}, error) {
stats := map[string]interface{}{} stats := map[string]interface{}{}
sqlStats, err := sa.store.GetUsageMetrics(ctx) storeStats, err := sa.store.GetUsageMetrics(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
stats["stats.serviceaccounts.count"] = sqlStats.ServiceAccounts stats["stats.serviceaccounts.count"] = storeStats.ServiceAccounts
stats["stats.serviceaccounts.tokens.count"] = sqlStats.Tokens stats["stats.serviceaccounts.tokens.count"] = storeStats.Tokens
var forcedExpiryEnabled int64 = 0
if storeStats.ForcedExpiryEnabled {
forcedExpiryEnabled = 1
}
stats["stats.serviceaccounts.forced_expiry_enabled.count"] = forcedExpiryEnabled
var secretScanEnabled int64 = 0 var secretScanEnabled int64 = 0
if sa.secretScanEnabled { if sa.secretScanEnabled {
@@ -57,8 +64,8 @@ func (sa *ServiceAccountsService) getUsageMetrics(ctx context.Context) (map[stri
stats["stats.serviceaccounts.secret_scan.enabled.count"] = secretScanEnabled stats["stats.serviceaccounts.secret_scan.enabled.count"] = secretScanEnabled
MStatTotalServiceAccountTokens.Set(float64(sqlStats.Tokens)) MStatTotalServiceAccountTokens.Set(float64(storeStats.Tokens))
MStatTotalServiceAccounts.Set(float64(sqlStats.ServiceAccounts)) MStatTotalServiceAccounts.Set(float64(storeStats.ServiceAccounts))
return stats, nil return stats, nil
} }
@@ -18,13 +18,16 @@ func Test_UsageStats(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
storeMock.ExpectedStats = &serviceaccounts.Stats{ storeMock.ExpectedStats = &serviceaccounts.Stats{
ServiceAccounts: 1, ServiceAccounts: 1,
Tokens: 1, Tokens: 1,
ForcedExpiryEnabled: false,
} }
stats, err := svc.getUsageMetrics(context.Background()) stats, err := svc.getUsageMetrics(context.Background())
require.NoError(t, err) require.NoError(t, err)
assert.Len(t, stats, 4, stats)
assert.Equal(t, int64(1), stats["stats.serviceaccounts.count"].(int64)) assert.Equal(t, int64(1), stats["stats.serviceaccounts.count"].(int64))
assert.Equal(t, int64(1), stats["stats.serviceaccounts.tokens.count"].(int64)) assert.Equal(t, int64(1), stats["stats.serviceaccounts.tokens.count"].(int64))
assert.Equal(t, int64(1), stats["stats.serviceaccounts.secret_scan.enabled.count"].(int64)) assert.Equal(t, int64(1), stats["stats.serviceaccounts.secret_scan.enabled.count"].(int64))
assert.Equal(t, int64(0), stats["stats.serviceaccounts.forced_expiry_enabled.count"].(int64))
} }
+3 -2
View File
@@ -152,8 +152,9 @@ const (
) )
type Stats struct { type Stats struct {
ServiceAccounts int64 `xorm:"serviceaccounts"` ServiceAccounts int64 `xorm:"serviceaccounts"`
Tokens int64 `xorm:"serviceaccount_tokens"` Tokens int64 `xorm:"serviceaccount_tokens"`
ForcedExpiryEnabled bool `xorm:"-"`
} }
// AccessEvaluator is used to protect the "Configuration > Service accounts" page access // AccessEvaluator is used to protect the "Configuration > Service accounts" page access