grafana-iam: enable dual writing for resource permissions (#112793)
* `grafana-iam`: enable dual writing for resource permissions Co-authored-by: jguer <joao.guerreiro@grafana.com> * copy paste mistake * Reduce complexity * nits to make the code easy to review * Forgot to check the error --------- Co-authored-by: jguer <joao.guerreiro@grafana.com>
This commit is contained in:
@@ -350,23 +350,59 @@ func (b *IdentityAccessManagementAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *ge
|
|||||||
}
|
}
|
||||||
//nolint:staticcheck // not yet migrated to OpenFeature
|
//nolint:staticcheck // not yet migrated to OpenFeature
|
||||||
if b.features.IsEnabledGlobally(featuremgmt.FlagKubernetesAuthzResourcePermissionApis) {
|
if b.features.IsEnabledGlobally(featuremgmt.FlagKubernetesAuthzResourcePermissionApis) {
|
||||||
resourcePermissionStore, err := NewLocalStore(iamv0.ResourcePermissionInfo, apiGroupInfo.Scheme, opts.OptsGetter, b.reg, b.accessClient, b.resourcePermissionsStorage)
|
if err := b.UpdateResourcePermissionsAPIGroup(apiGroupInfo, opts, storage, b.enableDualWriter, enableZanzanaSync); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if enableZanzanaSync {
|
|
||||||
b.logger.Info("Enabling AfterCreate, BeginUpdate, and AfterDelete hooks for ResourcePermission to sync to Zanzana")
|
|
||||||
resourcePermissionStore.AfterCreate = b.AfterResourcePermissionCreate
|
|
||||||
resourcePermissionStore.BeginUpdate = b.BeginResourcePermissionUpdate
|
|
||||||
resourcePermissionStore.AfterDelete = b.AfterResourcePermissionDelete
|
|
||||||
}
|
|
||||||
storage[iamv0.ResourcePermissionInfo.StoragePath()] = resourcePermissionStore
|
|
||||||
}
|
}
|
||||||
|
|
||||||
apiGroupInfo.VersionedResourcesStorageMap[legacyiamv0.VERSION] = storage
|
apiGroupInfo.VersionedResourcesStorageMap[legacyiamv0.VERSION] = storage
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *IdentityAccessManagementAPIBuilder) UpdateResourcePermissionsAPIGroup(
|
||||||
|
apiGroupInfo *genericapiserver.APIGroupInfo,
|
||||||
|
opts builder.APIGroupOptions,
|
||||||
|
storage map[string]rest.Storage,
|
||||||
|
enableDualWriter bool,
|
||||||
|
enableZanzanaSync bool,
|
||||||
|
) error {
|
||||||
|
var store rest.Storage
|
||||||
|
// Create the legacy store first
|
||||||
|
legacyStore, err := NewLocalStore(iamv0.ResourcePermissionInfo, apiGroupInfo.Scheme, opts.OptsGetter, b.reg, b.accessClient, b.resourcePermissionsStorage)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register the hooks for Zanzana sync
|
||||||
|
// FIXME: The hooks are registered on the legacy store
|
||||||
|
// Once we fully migrate to unified storage, we can move these hooks to the unified store
|
||||||
|
if enableZanzanaSync {
|
||||||
|
b.logger.Info("Enabling AfterCreate, BeginUpdate, and AfterDelete hooks for ResourcePermission to sync to Zanzana")
|
||||||
|
legacyStore.AfterCreate = b.AfterResourcePermissionCreate
|
||||||
|
legacyStore.BeginUpdate = b.BeginResourcePermissionUpdate
|
||||||
|
legacyStore.AfterDelete = b.AfterResourcePermissionDelete
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the default store to the legacy store
|
||||||
|
store = legacyStore
|
||||||
|
|
||||||
|
if enableDualWriter {
|
||||||
|
// Create the dual write store (UniStore + LegacyStore)
|
||||||
|
uniStore, err := grafanaregistry.NewRegistryStore(apiGroupInfo.Scheme, iamv0.ResourcePermissionInfo, opts.OptsGetter)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
store, err = opts.DualWriteBuilder(iamv0.ResourcePermissionInfo.GroupResource(), legacyStore, uniStore)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
storage[iamv0.ResourcePermissionInfo.StoragePath()] = store
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (b *IdentityAccessManagementAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions {
|
func (b *IdentityAccessManagementAPIBuilder) GetOpenAPIDefinitions() common.GetOpenAPIDefinitions {
|
||||||
return func(rc common.ReferenceCallback) map[string]common.OpenAPIDefinition {
|
return func(rc common.ReferenceCallback) map[string]common.OpenAPIDefinition {
|
||||||
dst := legacyiamv0.GetOpenAPIDefinitions(rc)
|
dst := legacyiamv0.GetOpenAPIDefinitions(rc)
|
||||||
|
|||||||
Reference in New Issue
Block a user