mirror of https://github.com/grafana/grafana
IAM: Register CoreRole apis (#106924)
* IAM: Register CoreRole apis
* one line store instantiation
* Small refactor for readability
* Add authorizer for CoreRole
* Nit
* Error strings should not end with punctiation
* Account for error
* Switch to use the local resource client
* error should not start with upper casing
* noopStorageErr should have a name starting with err
* Update workspace
* I don't know why I don't have the same output as the CI 🤷
* Dependency xOwnership
* imports
* Import order
* Rename alias to make it clear this is legacy
pull/101501/head^2
parent
6f8e33f360
commit
3d543a336f
@ -0,0 +1,73 @@ |
|||||||
|
package v0alpha1 |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/apimachinery/utils" |
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
||||||
|
"k8s.io/apimachinery/pkg/runtime" |
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema" |
||||||
|
) |
||||||
|
|
||||||
|
const ( |
||||||
|
GROUP = "iam.grafana.app" |
||||||
|
VERSION = "v0alpha1" |
||||||
|
APIVERSION = GROUP + "/" + VERSION |
||||||
|
) |
||||||
|
|
||||||
|
var CoreRoleInfo = utils.NewResourceInfo(GROUP, VERSION, |
||||||
|
"coreroles", "corerole", "CoreRole", |
||||||
|
func() runtime.Object { return &CoreRole{} }, |
||||||
|
func() runtime.Object { return &CoreRoleList{} }, |
||||||
|
utils.TableColumns{ |
||||||
|
Definition: []metav1.TableColumnDefinition{ |
||||||
|
{Name: "Name", Type: "string", Format: "name"}, |
||||||
|
{Name: "Title", Type: "string", Format: "string", Description: "Core role name"}, // Not sure this is actually needed
|
||||||
|
{Name: "Created At", Type: "date"}, |
||||||
|
}, |
||||||
|
Reader: func(obj any) ([]interface{}, error) { |
||||||
|
core, ok := obj.(*CoreRole) |
||||||
|
if ok { |
||||||
|
if core != nil { |
||||||
|
return []interface{}{ |
||||||
|
core.Name, |
||||||
|
core.Spec.Title, |
||||||
|
core.CreationTimestamp.UTC().Format(time.RFC3339), |
||||||
|
}, nil |
||||||
|
} |
||||||
|
} |
||||||
|
return nil, fmt.Errorf("expected core role") |
||||||
|
}, |
||||||
|
}, |
||||||
|
) |
||||||
|
|
||||||
|
var ( |
||||||
|
SchemeBuilder runtime.SchemeBuilder |
||||||
|
localSchemeBuilder = &SchemeBuilder |
||||||
|
AddToScheme = localSchemeBuilder.AddToScheme |
||||||
|
schemeGroupVersion = schema.GroupVersion{Group: GROUP, Version: VERSION} |
||||||
|
) |
||||||
|
|
||||||
|
func init() { |
||||||
|
localSchemeBuilder.Register(addKnownTypes, addDefaultingFuncs) |
||||||
|
} |
||||||
|
|
||||||
|
// Adds the list of known types to the given scheme.
|
||||||
|
func addKnownTypes(scheme *runtime.Scheme) error { |
||||||
|
scheme.AddKnownTypes(schemeGroupVersion, |
||||||
|
&CoreRole{}, |
||||||
|
&CoreRoleList{}, |
||||||
|
|
||||||
|
// What is this about?
|
||||||
|
&metav1.PartialObjectMetadata{}, |
||||||
|
&metav1.PartialObjectMetadataList{}, |
||||||
|
) |
||||||
|
metav1.AddToGroupVersion(scheme, schemeGroupVersion) |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func addDefaultingFuncs(scheme *runtime.Scheme) error { |
||||||
|
// return RegisterDefaults(scheme)
|
||||||
|
return nil |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package iam |
||||||
|
|
||||||
|
import ( |
||||||
|
"github.com/grafana/authlib/types" |
||||||
|
"github.com/grafana/grafana/pkg/registry/apis/iam/legacy" |
||||||
|
"github.com/grafana/grafana/pkg/registry/apis/iam/user" |
||||||
|
"github.com/grafana/grafana/pkg/services/apiserver/builder" |
||||||
|
"github.com/grafana/grafana/pkg/services/ssosettings" |
||||||
|
"github.com/grafana/grafana/pkg/storage/unified/resource" |
||||||
|
"github.com/prometheus/client_golang/prometheus" |
||||||
|
"k8s.io/apiserver/pkg/authorization/authorizer" |
||||||
|
) |
||||||
|
|
||||||
|
var _ builder.APIGroupBuilder = (*IdentityAccessManagementAPIBuilder)(nil) |
||||||
|
var _ builder.APIGroupRouteProvider = (*IdentityAccessManagementAPIBuilder)(nil) |
||||||
|
|
||||||
|
// CoreRoleStorageBackend uses the resource.StorageBackend interface to provide storage for core roles.
|
||||||
|
// Used wire to identify the storage backend for core roles.
|
||||||
|
type CoreRoleStorageBackend interface{ resource.StorageBackend } |
||||||
|
|
||||||
|
// This is used just so wire has something unique to return
|
||||||
|
type IdentityAccessManagementAPIBuilder struct { |
||||||
|
// Stores
|
||||||
|
store legacy.LegacyIdentityStore |
||||||
|
coreRolesStorage CoreRoleStorageBackend |
||||||
|
|
||||||
|
// Access Control
|
||||||
|
authorizer authorizer.Authorizer |
||||||
|
// legacyAccessClient is used for the identity apis, we need to migrate to the access client
|
||||||
|
legacyAccessClient types.AccessClient |
||||||
|
// accessClient is used for the core role apis
|
||||||
|
accessClient types.AccessClient |
||||||
|
|
||||||
|
reg prometheus.Registerer |
||||||
|
|
||||||
|
// non-k8s api route
|
||||||
|
display *user.LegacyDisplayREST |
||||||
|
|
||||||
|
// Not set for multi-tenant deployment for now
|
||||||
|
sso ssosettings.Service |
||||||
|
|
||||||
|
// Toggle for enabling authz management apis
|
||||||
|
enableAuthZApis bool |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
package noopstorage |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"errors" |
||||||
|
"net/http" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/storage/unified/resource" |
||||||
|
"github.com/grafana/grafana/pkg/storage/unified/resourcepb" |
||||||
|
) |
||||||
|
|
||||||
|
var ( |
||||||
|
_ resource.StorageBackend = &StorageBackendImpl{} |
||||||
|
|
||||||
|
errNoopStorage = errors.New("unavailable functionality") |
||||||
|
) |
||||||
|
|
||||||
|
type StorageBackendImpl struct{} |
||||||
|
|
||||||
|
func ProvideStorageBackend() *StorageBackendImpl { |
||||||
|
return &StorageBackendImpl{} |
||||||
|
} |
||||||
|
|
||||||
|
// GetResourceStats implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]resource.ResourceStats, error) { |
||||||
|
return []resource.ResourceStats{}, errNoopStorage |
||||||
|
} |
||||||
|
|
||||||
|
// ListHistory implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) ListHistory(context.Context, *resourcepb.ListRequest, func(resource.ListIterator) error) (int64, error) { |
||||||
|
return 0, errNoopStorage |
||||||
|
} |
||||||
|
|
||||||
|
// ListIterator implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) ListIterator(context.Context, *resourcepb.ListRequest, func(resource.ListIterator) error) (int64, error) { |
||||||
|
return 0, errNoopStorage |
||||||
|
} |
||||||
|
|
||||||
|
// ReadResource implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) ReadResource(_ context.Context, req *resourcepb.ReadRequest) *resource.BackendReadResponse { |
||||||
|
return &resource.BackendReadResponse{ |
||||||
|
Key: req.GetKey(), |
||||||
|
Error: &resourcepb.ErrorResult{Code: http.StatusForbidden, Message: errNoopStorage.Error()}, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// WatchWriteEvents implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) WatchWriteEvents(ctx context.Context) (<-chan *resource.WrittenEvent, error) { |
||||||
|
stream := make(chan *resource.WrittenEvent, 10) |
||||||
|
return stream, nil |
||||||
|
} |
||||||
|
|
||||||
|
// WriteEvent implements resource.StorageBackend.
|
||||||
|
func (c *StorageBackendImpl) WriteEvent(context.Context, resource.WriteEvent) (int64, error) { |
||||||
|
return 0, errNoopStorage |
||||||
|
} |
Loading…
Reference in new issue