4747import org .elasticsearch .rest .RestStatus ;
4848import org .elasticsearch .threadpool .Scheduler ;
4949import org .elasticsearch .xcontent .XContentType ;
50+ import org .elasticsearch .xpack .core .security .authc .support .mapper .ExpressionRoleMapping ;
5051import org .elasticsearch .xpack .core .security .authz .RoleMappingMetadata ;
5152import org .elasticsearch .xpack .security .SecurityFeatures ;
5253
@@ -273,7 +274,18 @@ private static boolean isCreatedOnLatestVersion(IndexMetadata indexMetadata) {
273274
274275 private static Set <String > getFileSettingsMetadataHandlerRoleMappingKeys (ClusterState clusterState ) {
275276 ReservedStateMetadata fileSettingsMetadata = clusterState .metadata ().reservedStateMetadata ().get (FILE_SETTINGS_METADATA_NAMESPACE );
276- return fileSettingsMetadata .handlers ().get (HANDLER_ROLE_MAPPINGS_NAME ).keys ();
277+ if (fileSettingsMetadata != null && fileSettingsMetadata .handlers ().containsKey (HANDLER_ROLE_MAPPINGS_NAME )) {
278+ return fileSettingsMetadata .handlers ().get (HANDLER_ROLE_MAPPINGS_NAME ).keys ();
279+ }
280+ return Set .of ();
281+ }
282+
283+ private static Set <ExpressionRoleMapping > getRoleMappingMetadataMappings (ClusterState clusterState ) {
284+ RoleMappingMetadata roleMappingMetadata = RoleMappingMetadata .getFromClusterState (clusterState );
285+ if (roleMappingMetadata == null ) {
286+ return Set .of ();
287+ }
288+ return roleMappingMetadata .getRoleMappings ();
277289 }
278290
279291 @ Override
@@ -294,9 +306,8 @@ public void clusterChanged(ClusterChangedEvent event) {
294306 final boolean indexAvailableForWrite = available .v1 ();
295307 final boolean indexAvailableForSearch = available .v2 ();
296308 final Set <String > reservedStateRoleMappingNames = getFileSettingsMetadataHandlerRoleMappingKeys (event .state ());
297- final boolean reservedRoleMappingsSynced = reservedStateRoleMappingNames .size () == RoleMappingMetadata .getFromClusterState (
298- event .state ()
299- ).getRoleMappings ().size ();
309+ final boolean reservedRoleMappingsSynced = reservedStateRoleMappingNames .size () == getRoleMappingMetadataMappings (event .state ())
310+ .size ();
300311 final boolean mappingIsUpToDate = indexMetadata == null || checkIndexMappingUpToDate (event .state ());
301312 final int migrationsVersion = getMigrationVersionFromIndexMetadata (indexMetadata );
302313 final SystemIndexDescriptor .MappingsVersion minClusterMappingVersion = getMinSecurityIndexMappingVersion (event .state ());
0 commit comments