influxdb/internal/resource/resolve.go

329 lines
7.5 KiB
Go

package resource
import (
"context"
"fmt"
"github.com/influxdata/influxdb/v2"
)
// Resolver is a type which combines multiple resource services
// in order to resolve the resources associated org ID.
// Ideally you do not need to use this type, it is mostly a stop-gap
// while we migrate responsibilities off of *kv.Service.
// Consider it deprecated.
type Resolver struct {
AuthorizationFinder interface {
FindAuthorizationByID(context.Context, influxdb.ID) (*influxdb.Authorization, error)
}
BucketFinder interface {
FindBucketByID(context.Context, influxdb.ID) (*influxdb.Bucket, error)
}
OrganizationFinder interface {
FindOrganizationByID(context.Context, influxdb.ID) (*influxdb.Organization, error)
}
DashboardFinder interface {
FindDashboardByID(context.Context, influxdb.ID) (*influxdb.Dashboard, error)
}
SourceFinder interface {
FindSourceByID(context.Context, influxdb.ID) (*influxdb.Source, error)
}
TaskFinder interface {
FindTaskByID(context.Context, influxdb.ID) (*influxdb.Task, error)
}
TelegrafConfigFinder interface {
FindTelegrafConfigByID(context.Context, influxdb.ID) (*influxdb.TelegrafConfig, error)
}
VariableFinder interface {
FindVariableByID(context.Context, influxdb.ID) (*influxdb.Variable, error)
}
TargetFinder interface {
GetTargetByID(context.Context, influxdb.ID) (*influxdb.ScraperTarget, error)
}
CheckFinder interface {
FindCheckByID(context.Context, influxdb.ID) (influxdb.Check, error)
}
NotificationEndpointFinder interface {
FindNotificationEndpointByID(context.Context, influxdb.ID) (influxdb.NotificationEndpoint, error)
}
NotificationRuleFinder interface {
FindNotificationRuleByID(context.Context, influxdb.ID) (influxdb.NotificationRule, error)
}
}
// FindResourceOrganizationID is used to find the organization that a resource belongs to five the id of a resource and a resource type.
func (o *Resolver) FindResourceOrganizationID(ctx context.Context, rt influxdb.ResourceType, id influxdb.ID) (influxdb.ID, error) {
switch rt {
case influxdb.AuthorizationsResourceType:
if o.AuthorizationFinder == nil {
break
}
r, err := o.AuthorizationFinder.FindAuthorizationByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrgID, nil
case influxdb.BucketsResourceType:
if o.BucketFinder == nil {
break
}
r, err := o.BucketFinder.FindBucketByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrgID, nil
case influxdb.OrgsResourceType:
if o.OrganizationFinder == nil {
break
}
r, err := o.OrganizationFinder.FindOrganizationByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.ID, nil
case influxdb.DashboardsResourceType:
if o.DashboardFinder == nil {
break
}
r, err := o.DashboardFinder.FindDashboardByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrganizationID, nil
case influxdb.SourcesResourceType:
if o.SourceFinder == nil {
break
}
r, err := o.SourceFinder.FindSourceByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrganizationID, nil
case influxdb.TasksResourceType:
if o.TaskFinder == nil {
break
}
r, err := o.TaskFinder.FindTaskByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrganizationID, nil
case influxdb.TelegrafsResourceType:
if o.TelegrafConfigFinder == nil {
break
}
r, err := o.TelegrafConfigFinder.FindTelegrafConfigByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrgID, nil
case influxdb.VariablesResourceType:
if o.VariableFinder == nil {
break
}
r, err := o.VariableFinder.FindVariableByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrganizationID, nil
case influxdb.ScraperResourceType:
if o.TargetFinder == nil {
break
}
r, err := o.TargetFinder.GetTargetByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.OrgID, nil
case influxdb.ChecksResourceType:
if o.CheckFinder == nil {
break
}
r, err := o.CheckFinder.FindCheckByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.GetOrgID(), nil
case influxdb.NotificationEndpointResourceType:
if o.NotificationEndpointFinder == nil {
break
}
r, err := o.NotificationEndpointFinder.FindNotificationEndpointByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.GetOrgID(), nil
case influxdb.NotificationRuleResourceType:
if o.NotificationRuleFinder == nil {
break
}
r, err := o.NotificationRuleFinder.FindNotificationRuleByID(ctx, id)
if err != nil {
return influxdb.InvalidID(), err
}
return r.GetOrgID(), nil
}
return influxdb.InvalidID(), &influxdb.Error{
Msg: fmt.Sprintf("unsupported resource type %s", rt),
}
}
// FindResourceName is used to find the name of the resource associated with the provided type and id.
func (o *Resolver) FindResourceName(ctx context.Context, rt influxdb.ResourceType, id influxdb.ID) (string, error) {
switch rt {
case influxdb.AuthorizationsResourceType:
// keeping this consistent with the original kv implementation
return "", nil
case influxdb.BucketsResourceType:
if o.BucketFinder == nil {
break
}
r, err := o.BucketFinder.FindBucketByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.OrgsResourceType:
if o.OrganizationFinder == nil {
break
}
r, err := o.OrganizationFinder.FindOrganizationByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.DashboardsResourceType:
if o.DashboardFinder == nil {
break
}
r, err := o.DashboardFinder.FindDashboardByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.SourcesResourceType:
if o.SourceFinder == nil {
break
}
r, err := o.SourceFinder.FindSourceByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.TasksResourceType:
if o.TaskFinder == nil {
break
}
r, err := o.TaskFinder.FindTaskByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.TelegrafsResourceType:
if o.TelegrafConfigFinder == nil {
break
}
r, err := o.TelegrafConfigFinder.FindTelegrafConfigByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.VariablesResourceType:
if o.VariableFinder == nil {
break
}
r, err := o.VariableFinder.FindVariableByID(ctx, id)
if err != nil {
return "", nil
}
return r.Name, nil
case influxdb.ScraperResourceType:
if o.TargetFinder == nil {
break
}
r, err := o.TargetFinder.GetTargetByID(ctx, id)
if err != nil {
return "", err
}
return r.Name, nil
case influxdb.ChecksResourceType:
if o.CheckFinder == nil {
break
}
r, err := o.CheckFinder.FindCheckByID(ctx, id)
if err != nil {
return "", err
}
return r.GetName(), nil
case influxdb.NotificationEndpointResourceType:
if o.NotificationEndpointFinder == nil {
break
}
r, err := o.NotificationEndpointFinder.FindNotificationEndpointByID(ctx, id)
if err != nil {
return "", err
}
return r.GetName(), nil
case influxdb.NotificationRuleResourceType:
if o.NotificationRuleFinder == nil {
break
}
r, err := o.NotificationRuleFinder.FindNotificationRuleByID(ctx, id)
if err != nil {
return "", err
}
return r.GetName(), nil
}
// default behaviour (in-line with original implementation) is to just return
// an empty name
return "", nil
}