diff --git a/bootstrap/openmetadata-ops.sh b/bootstrap/openmetadata-ops.sh index 528eda0bc7e..b2d3e2db1f3 100755 --- a/bootstrap/openmetadata-ops.sh +++ b/bootstrap/openmetadata-ops.sh @@ -54,4 +54,5 @@ else fi ${JAVA} -Dbootstrap.dir=$BOOTSTRAP_DIR -cp ${CLASSPATH} ${OPENMETADATA_SETUP_MAIN_CLASS} -c $CONFIG_FILE_PATH "$@" +exit $? diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/util/OpenMetadataOperations.java b/openmetadata-service/src/main/java/org/openmetadata/service/util/OpenMetadataOperations.java index 34aff3089e2..e5086378fda 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/util/OpenMetadataOperations.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/util/OpenMetadataOperations.java @@ -436,17 +436,18 @@ public class OpenMetadataOperations implements Callable { throw new IllegalArgumentException("Invalid email address: " + email); } parseConfig(); + initializeCollectionRegistry(); + initializeSecurityConfig(); AuthProvider authProvider = SecurityConfigurationManager.getCurrentAuthConfig().getProvider(); if (!authProvider.equals(AuthProvider.BASIC)) { LOG.error("Authentication is not set to basic. User creation is not supported."); return 1; } - initializeCollectionRegistry(); UserRepository userRepository = (UserRepository) Entity.getEntityRepository(Entity.USER); try { userRepository.getByEmail(null, email, EntityUtil.Fields.EMPTY_FIELDS); - LOG.error("User {} already exists.", email); - return 1; + LOG.info("User {} already exists.", email); + return 0; } catch (EntityNotFoundException ex) { // Expected – continue to create the user. } @@ -477,6 +478,29 @@ public class OpenMetadataOperations implements Callable { } } + private void initializeSecurityConfig() { + try { + var authConfig = + Entity.getSystemRepository() + .getConfigWithKey(SettingsType.AUTHENTICATION_CONFIGURATION.value()); + if (authConfig != null) { + SecurityConfigurationManager.getInstance() + .setCurrentAuthConfig( + JsonUtils.convertValue( + authConfig.getConfigValue(), + org.openmetadata.schema.api.security.AuthenticationConfiguration.class)); + } else if (config.getAuthenticationConfiguration() != null) { + SecurityConfigurationManager.getInstance() + .setCurrentAuthConfig(config.getAuthenticationConfiguration()); + } + } catch (Exception e) { + if (config.getAuthenticationConfiguration() != null) { + SecurityConfigurationManager.getInstance() + .setCurrentAuthConfig(config.getAuthenticationConfiguration()); + } + } + } + private boolean isAppInstalled(AppRepository appRepository, String appName) { try { appRepository.findByName(appName, Include.NON_DELETED); diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/util/OpenMetadataOperationsTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/util/OpenMetadataOperationsTest.java index 8af7c85781c..e3399e308eb 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/util/OpenMetadataOperationsTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/util/OpenMetadataOperationsTest.java @@ -37,6 +37,7 @@ import org.openmetadata.service.Entity; import org.openmetadata.service.jdbi3.AppRepository; import org.openmetadata.service.jdbi3.CollectionDAO; import org.openmetadata.service.search.IndexMappingVersionTracker; +import org.openmetadata.service.security.auth.SecurityConfigurationManager; @ExtendWith(MockitoExtension.class) @Slf4j @@ -234,6 +235,22 @@ public class OpenMetadataOperationsTest { "Should update versions after successful reindexing"); } + @Test + void testCreateUser_NullAuthConfigThrowsException() throws Exception { + try (MockedStatic securityManagerMock = + Mockito.mockStatic(SecurityConfigurationManager.class)) { + securityManagerMock.when(SecurityConfigurationManager::getCurrentAuthConfig).thenReturn(null); + + OpenMetadataOperations ops = new OpenMetadataOperations(); + char[] password = "testPassword123".toCharArray(); + String email = "test@example.com"; + + int result = ops.createUser(email, password, false); + + assertEquals(1, result); + } + } + // Helper methods using reflection to access private fields for testing private String getVersionFromTracker(IndexMappingVersionTracker tracker) throws Exception { Field versionField = IndexMappingVersionTracker.class.getDeclaredField("version");