The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/pkg/registry/apis/provisioning/resources/repository.go

87 lines
3.3 KiB

package resources
import (
"context"
"fmt"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
provisioning "github.com/grafana/grafana/pkg/apis/provisioning/v0alpha1"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/repository"
)
//go:generate mockery --name RepositoryResourcesFactory --structname MockRepositoryResourcesFactory --inpackage --filename repository_resources_factory_mock.go --with-expecter
type RepositoryResourcesFactory interface {
Client(ctx context.Context, repo repository.ReaderWriter) (RepositoryResources, error)
}
//go:generate mockery --name RepositoryResources --structname MockRepositoryResources --inpackage --filename repository_resources_mock.go --with-expecter
type RepositoryResources interface {
// Folders
SetTree(tree FolderTree)
EnsureFolderPathExist(ctx context.Context, filePath string) (parent string, err error)
EnsureFolderExists(ctx context.Context, folder Folder, parentID string) error
EnsureFolderTreeExists(ctx context.Context, ref, path string, tree FolderTree, fn func(folder Folder, created bool, err error) error) error
// File from Resource
WriteResourceFileFromObject(ctx context.Context, obj *unstructured.Unstructured, options WriteOptions) (string, error)
// Resource from file
WriteResourceFromFile(ctx context.Context, path, ref string) (string, schema.GroupVersionKind, error)
RemoveResourceFromFile(ctx context.Context, path, ref string) (string, schema.GroupVersionKind, error)
RenameResourceFile(ctx context.Context, path, previousRef, newPath, newRef string) (string, schema.GroupVersionKind, error)
// Stats
Stats(ctx context.Context) (*provisioning.ResourceStats, error)
List(ctx context.Context) (*provisioning.ResourceList, error)
}
type repositoryResourcesFactory struct {
parsers ParserFactory
clients ClientFactory
lister ResourceLister
}
type repositoryResources struct {
*FolderManager
*ResourcesManager
lister ResourceLister
namespace string
repoName string
}
func (r *repositoryResources) Stats(ctx context.Context) (*provisioning.ResourceStats, error) {
return r.lister.Stats(ctx, r.namespace, r.repoName)
}
func (r *repositoryResources) List(ctx context.Context) (*provisioning.ResourceList, error) {
return r.lister.List(ctx, r.namespace, r.repoName)
}
func NewRepositoryResourcesFactory(parsers ParserFactory, clients ClientFactory, lister ResourceLister) RepositoryResourcesFactory {
return &repositoryResourcesFactory{parsers, clients, lister}
}
func (r *repositoryResourcesFactory) Client(ctx context.Context, repo repository.ReaderWriter) (RepositoryResources, error) {
clients, err := r.clients.Clients(ctx, repo.Config().Namespace)
if err != nil {
return nil, fmt.Errorf("create clients: %w", err)
}
folderClient, err := clients.Folder()
if err != nil {
return nil, fmt.Errorf("create folder client: %w", err)
}
parser, err := r.parsers.GetParser(ctx, repo)
if err != nil {
return nil, fmt.Errorf("create parser: %w", err)
}
folders := NewFolderManager(repo, folderClient, NewEmptyFolderTree())
resources := NewResourcesManager(repo, folders, parser, clients)
return &repositoryResources{
FolderManager: folders,
ResourcesManager: resources,
lister: r.lister,
namespace: repo.Config().Namespace,
repoName: repo.Config().Name,
}, nil
}