diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/ServiceEntityResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/ServiceEntityResource.java index 9efbec6e4d9f..696743ac131a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/ServiceEntityResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/ServiceEntityResource.java @@ -19,6 +19,7 @@ import jakarta.ws.rs.core.SecurityContext; import jakarta.ws.rs.core.UriInfo; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.openmetadata.schema.ServiceConnectionEntityInterface; import org.openmetadata.schema.ServiceEntityInterface; import org.openmetadata.schema.entity.services.ServiceType; @@ -37,6 +38,7 @@ import org.openmetadata.service.secrets.masker.EntityMaskerFactory; import org.openmetadata.service.security.Authorizer; +@Slf4j public abstract class ServiceEntityResource< T extends ServiceEntityInterface, R extends ServiceEntityRepository, @@ -81,7 +83,23 @@ private Object retrieveServiceConnectionConfig(T service, boolean maskPassword) protected ResultList decryptOrNullify( SecurityContext securityContext, ResultList services) { - listOrEmpty(services.getData()).forEach(service -> decryptOrNullify(securityContext, service)); + // Degrade per service rather than failing the whole list. A single connection that + // cannot be decrypted -- most often after the Fernet key changes -- would otherwise + // propagate out of the loop and fail the request, hiding every other service and + // leaving no way to reach the affected one's edit form to repair it. + listOrEmpty(services.getData()) + .forEach( + service -> { + try { + decryptOrNullify(securityContext, service); + } catch (Exception e) { + LOG.warn( + "Failed to decrypt connection of service '{}'; returning it without one: {}", + service.getFullyQualifiedName(), + e.getMessage()); + nullifyConnection(service); + } + }); return services; }