K8s: Folders: Modify GetChildren to return only Folder References (#103072)
* Return FolderReference instead of Folder on GetChildren Signed-off-by: Maicon Costa <maiconscosta@gmail.com> --------- Signed-off-by: Maicon Costa <maiconscosta@gmail.com>
This commit is contained in:
@@ -515,7 +515,7 @@ func Test_authorizeAccessToRuleGroup(t *testing.T) {
|
||||
t.Run("should fail if user does not have access to namespace", func(t *testing.T) {
|
||||
f := &folder.Folder{UID: "test-folder"}
|
||||
gen := models.RuleGen
|
||||
genWithFolder := gen.With(gen.WithNamespace(f))
|
||||
genWithFolder := gen.With(gen.WithNamespace(f.ToFolderReference()))
|
||||
rules := genWithFolder.GenerateManyRef(1, 5)
|
||||
|
||||
ac := &recordingAccessControlFake{}
|
||||
|
||||
@@ -413,7 +413,7 @@ func (srv *ConvertPrometheusSrv) RouteConvertPrometheusPostRuleGroups(c *context
|
||||
return successfulResponse()
|
||||
}
|
||||
|
||||
func (srv *ConvertPrometheusSrv) getOrCreateNamespace(c *contextmodel.ReqContext, title string, logger log.Logger, workingFolderUID string) (*folder.Folder, response.Response) {
|
||||
func (srv *ConvertPrometheusSrv) getOrCreateNamespace(c *contextmodel.ReqContext, title string, logger log.Logger, workingFolderUID string) (*folder.FolderReference, response.Response) {
|
||||
logger.Debug("Getting or creating a new folder")
|
||||
|
||||
ns, err := srv.ruleStore.GetOrCreateNamespaceByTitle(
|
||||
|
||||
@@ -83,7 +83,7 @@ func TestRouteDeleteAlertRules(t *testing.T) {
|
||||
t.Run("and group argument is empty", func(t *testing.T) {
|
||||
t.Run("return Forbidden if user is not authorized to access any group in the folder", func(t *testing.T) {
|
||||
ruleStore := initFakeRuleStore(t)
|
||||
ruleStore.PutRule(context.Background(), gen.With(gen.WithNamespace(folder)).GenerateManyRef(1, 5)...)
|
||||
ruleStore.PutRule(context.Background(), gen.With(gen.WithNamespace(folder.ToFolderReference())).GenerateManyRef(1, 5)...)
|
||||
|
||||
request := createRequestContextWithPerms(orgID, map[int64]map[string][]string{}, nil)
|
||||
|
||||
@@ -96,7 +96,7 @@ func TestRouteDeleteAlertRules(t *testing.T) {
|
||||
ruleStore := initFakeRuleStore(t)
|
||||
provisioningStore := fakes.NewFakeProvisioningStore()
|
||||
|
||||
folderGen := gen.With(gen.WithNamespace(folder))
|
||||
folderGen := gen.With(gen.WithNamespace(folder.ToFolderReference()))
|
||||
|
||||
authorizedRulesInFolder := folderGen.With(gen.WithGroupPrefix("authz-")).GenerateManyRef(1, 5)
|
||||
|
||||
@@ -123,7 +123,7 @@ func TestRouteDeleteAlertRules(t *testing.T) {
|
||||
ruleStore := initFakeRuleStore(t)
|
||||
provisioningStore := fakes.NewFakeProvisioningStore()
|
||||
|
||||
folderGen := gen.With(gen.WithNamespace(folder))
|
||||
folderGen := gen.With(gen.WithNamespace(folder.ToFolderReference()))
|
||||
|
||||
provisionedRulesInFolder := folderGen.With(gen.WithSameGroup()).GenerateManyRef(1, 5)
|
||||
err := provisioningStore.SetProvenance(context.Background(), provisionedRulesInFolder[0], orgID, models.ProvenanceAPI)
|
||||
@@ -155,7 +155,7 @@ func TestRouteDeleteAlertRules(t *testing.T) {
|
||||
t.Run("return Forbidden if user is not authorized to access the group", func(t *testing.T) {
|
||||
ruleStore := initFakeRuleStore(t)
|
||||
|
||||
groupGen := gen.With(gen.WithNamespace(folder), gen.WithSameGroup())
|
||||
groupGen := gen.With(gen.WithNamespace(folder.ToFolderReference()), gen.WithSameGroup())
|
||||
|
||||
authorizedRulesInGroup := groupGen.GenerateManyRef(1, 5)
|
||||
ruleStore.PutRule(context.Background(), authorizedRulesInGroup...)
|
||||
@@ -175,7 +175,7 @@ func TestRouteDeleteAlertRules(t *testing.T) {
|
||||
ruleStore := initFakeRuleStore(t)
|
||||
provisioningStore := fakes.NewFakeProvisioningStore()
|
||||
|
||||
groupGen := gen.With(gen.WithNamespace(folder), gen.WithSameGroup())
|
||||
groupGen := gen.With(gen.WithNamespace(folder.ToFolderReference()), gen.WithSameGroup())
|
||||
|
||||
provisionedRulesInFolder := groupGen.GenerateManyRef(1, 5)
|
||||
err := provisioningStore.SetProvenance(context.Background(), provisionedRulesInFolder[0], orgID, models.ProvenanceAPI)
|
||||
@@ -204,7 +204,7 @@ func TestRouteGetNamespaceRulesConfig(t *testing.T) {
|
||||
folder := randFolder()
|
||||
ruleStore := fakes.NewRuleStore(t)
|
||||
ruleStore.Folders[orgID] = append(ruleStore.Folders[orgID], folder)
|
||||
folderGen := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder))
|
||||
folderGen := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder.ToFolderReference()))
|
||||
queryAccessRules := folderGen.GenerateManyRef(2, 6)
|
||||
ruleStore.PutRule(context.Background(), queryAccessRules...)
|
||||
noQueryAccessRules := folderGen.GenerateManyRef(2, 6)
|
||||
@@ -246,7 +246,7 @@ func TestRouteGetNamespaceRulesConfig(t *testing.T) {
|
||||
folder := randFolder()
|
||||
ruleStore := fakes.NewRuleStore(t)
|
||||
ruleStore.Folders[orgID] = append(ruleStore.Folders[orgID], folder)
|
||||
expectedRules := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder)).GenerateManyRef(2, 6)
|
||||
expectedRules := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder.ToFolderReference())).GenerateManyRef(2, 6)
|
||||
ruleStore.PutRule(context.Background(), expectedRules...)
|
||||
|
||||
svc := createService(ruleStore)
|
||||
|
||||
@@ -12,13 +12,13 @@ import (
|
||||
// RuleStore is the interface for persisting alert rules and instances
|
||||
type RuleStore interface {
|
||||
// TODO after deprecating namespace_id field in GettableGrafanaRule we can simplify this interface
|
||||
// by returning map[string]struct{} instead of map[string]*folder.Folder
|
||||
// by returning map[string]struct{} instead of map[string]*folder.FolderReference
|
||||
GetUserVisibleNamespaces(context.Context, int64, identity.Requester) (map[string]*folder.Folder, error)
|
||||
GetNamespaceByUID(ctx context.Context, uid string, orgID int64, user identity.Requester) (*folder.Folder, error)
|
||||
GetNamespaceByTitle(ctx context.Context, fullpath string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error)
|
||||
GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error)
|
||||
GetNamespaceByTitle(ctx context.Context, fullpath string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error)
|
||||
GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error)
|
||||
// GetNamespaceChildren returns all children (first level) of the namespace with the given id.
|
||||
GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.Folder, error)
|
||||
GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.FolderReference, error)
|
||||
|
||||
GetAlertRuleByUID(ctx context.Context, query *ngmodels.GetAlertRuleByUIDQuery) (*ngmodels.AlertRule, error)
|
||||
GetAlertRulesGroupByRuleUID(ctx context.Context, query *ngmodels.GetAlertRulesGroupByRuleUIDQuery) ([]*ngmodels.AlertRule, error)
|
||||
|
||||
@@ -320,7 +320,7 @@ type Namespaced interface {
|
||||
GetNamespaceUID() string
|
||||
}
|
||||
|
||||
type Namespace folder.Folder
|
||||
type Namespace folder.FolderReference
|
||||
|
||||
func (n Namespace) GetNamespaceUID() string {
|
||||
return n.UID
|
||||
|
||||
@@ -298,7 +298,7 @@ func (a *AlertRuleMutators) WithNamespaceUID(namespaceUID string) AlertRuleMutat
|
||||
}
|
||||
}
|
||||
|
||||
func (a *AlertRuleMutators) WithNamespace(namespace *folder.Folder) AlertRuleMutator {
|
||||
func (a *AlertRuleMutators) WithNamespace(namespace *folder.FolderReference) AlertRuleMutator {
|
||||
return a.WithNamespaceUID(namespace.UID)
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ func Test_subscribeToFolderChanges(t *testing.T) {
|
||||
Title: "Folder" + util.GenerateShortUID(),
|
||||
}
|
||||
gen := models.RuleGen
|
||||
rules := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder1)).GenerateManyRef(5)
|
||||
rules := gen.With(gen.WithOrgID(orgID), gen.WithNamespace(folder1.ToFolderReference())).GenerateManyRef(5)
|
||||
|
||||
bus := bus.ProvideBus(tracing.InitializeTracerForTest())
|
||||
db := fakes.NewRuleStore(t)
|
||||
|
||||
@@ -522,7 +522,7 @@ func (h *RemoteLokiBackend) getFolderUIDsForFilter(ctx context.Context, query mo
|
||||
uids := make([]string, 0, len(folders))
|
||||
// now keep only UIDs of folder in which user can read rules.
|
||||
for _, f := range folders {
|
||||
hasAccess, err := h.ac.HasAccessInFolder(ctx, query.SignedInUser, models.Namespace(*f))
|
||||
hasAccess, err := h.ac.HasAccessInFolder(ctx, query.SignedInUser, models.Namespace(*f.ToFolderReference()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ func (st DBstore) GetNamespaceByUID(ctx context.Context, uid string, orgID int64
|
||||
}
|
||||
|
||||
// GetNamespaceChildren gets namespace (folder) children (first level) by its UID.
|
||||
func (st DBstore) GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.Folder, error) {
|
||||
func (st DBstore) GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.FolderReference, error) {
|
||||
q := &folder.GetChildrenQuery{
|
||||
UID: uid,
|
||||
OrgID: orgID,
|
||||
@@ -55,7 +55,7 @@ func (st DBstore) GetNamespaceChildren(ctx context.Context, uid string, orgID in
|
||||
return nil, err
|
||||
}
|
||||
|
||||
found := make([]*folder.Folder, 0, len(folders))
|
||||
found := make([]*folder.FolderReference, 0, len(folders))
|
||||
for _, f := range folders {
|
||||
if f.ParentUID == uid {
|
||||
found = append(found, f)
|
||||
@@ -66,13 +66,13 @@ func (st DBstore) GetNamespaceChildren(ctx context.Context, uid string, orgID in
|
||||
}
|
||||
|
||||
// GetNamespaceByTitle gets namespace by its title in the specified folder.
|
||||
func (st DBstore) GetNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error) {
|
||||
func (st DBstore) GetNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error) {
|
||||
folders, err := st.GetNamespaceChildren(ctx, parentUID, orgID, user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
foundByTitle := []*folder.Folder{}
|
||||
foundByTitle := []*folder.FolderReference{}
|
||||
for _, f := range folders {
|
||||
if f.Title == title {
|
||||
foundByTitle = append(foundByTitle, f)
|
||||
@@ -95,12 +95,12 @@ func (st DBstore) GetNamespaceByTitle(ctx context.Context, title string, orgID i
|
||||
//
|
||||
// To avoid race conditions when two concurrent requests try to create the same folder,
|
||||
// we create folders with a deterministic UID based on the parent UID, title, and organization ID.
|
||||
func (st DBstore) GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error) {
|
||||
func (st DBstore) GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error) {
|
||||
if len(title) == 0 {
|
||||
return nil, fmt.Errorf("title is empty")
|
||||
}
|
||||
|
||||
var f *folder.Folder
|
||||
var f *folder.FolderReference
|
||||
var err error
|
||||
|
||||
f, err = st.GetNamespaceByTitle(ctx, title, orgID, user, parentUID)
|
||||
@@ -122,7 +122,8 @@ func (st DBstore) GetOrCreateNamespaceByTitle(ctx context.Context, title string,
|
||||
SignedInUser: user,
|
||||
ParentUID: parentUID,
|
||||
}
|
||||
f, err = st.FolderService.Create(ctx, cmd)
|
||||
var newFolder *folder.Folder
|
||||
newFolder, err = st.FolderService.Create(ctx, cmd)
|
||||
if err != nil {
|
||||
// Handle potential race condition where another request might have created
|
||||
// the folder between our check and creation attempt
|
||||
@@ -137,6 +138,8 @@ func (st DBstore) GetOrCreateNamespaceByTitle(ctx context.Context, title string,
|
||||
fmt.Errorf("lookup folder: %w", lookupErr),
|
||||
))
|
||||
}
|
||||
|
||||
f = newFolder.ToFolderReference()
|
||||
}
|
||||
|
||||
return f, nil
|
||||
|
||||
@@ -273,13 +273,13 @@ func (f *RuleStore) GetNamespaceByUID(_ context.Context, uid string, orgID int64
|
||||
return nil, fmt.Errorf("not found")
|
||||
}
|
||||
|
||||
func (f *RuleStore) GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error) {
|
||||
func (f *RuleStore) GetOrCreateNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error) {
|
||||
f.mtx.Lock()
|
||||
defer f.mtx.Unlock()
|
||||
|
||||
for _, folder := range f.Folders[orgID] {
|
||||
if folder.Title == title && folder.ParentUID == parentUID {
|
||||
return folder, nil
|
||||
return folder.ToFolderReference(), nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,31 +292,31 @@ func (f *RuleStore) GetOrCreateNamespaceByTitle(ctx context.Context, title strin
|
||||
}
|
||||
|
||||
f.Folders[orgID] = append(f.Folders[orgID], newFolder)
|
||||
return newFolder, nil
|
||||
return newFolder.ToFolderReference(), nil
|
||||
}
|
||||
|
||||
func (f *RuleStore) GetNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.Folder, error) {
|
||||
func (f *RuleStore) GetNamespaceByTitle(ctx context.Context, title string, orgID int64, user identity.Requester, parentUID string) (*folder.FolderReference, error) {
|
||||
f.mtx.Lock()
|
||||
defer f.mtx.Unlock()
|
||||
|
||||
for _, folder := range f.Folders[orgID] {
|
||||
if folder.Title == title && folder.ParentUID == parentUID {
|
||||
return folder, nil
|
||||
return folder.ToFolderReference(), nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, dashboards.ErrFolderNotFound
|
||||
}
|
||||
|
||||
func (f *RuleStore) GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.Folder, error) {
|
||||
func (f *RuleStore) GetNamespaceChildren(ctx context.Context, uid string, orgID int64, user identity.Requester) ([]*folder.FolderReference, error) {
|
||||
f.mtx.Lock()
|
||||
defer f.mtx.Unlock()
|
||||
|
||||
result := []*folder.Folder{}
|
||||
result := []*folder.FolderReference{}
|
||||
|
||||
for _, folder := range f.Folders[orgID] {
|
||||
if folder.ParentUID == uid {
|
||||
result = append(result, folder)
|
||||
result = append(result, folder.ToFolderReference())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user