Hi All. I've been trying to setup `datahub-fronten...
# troubleshoot
a
Hi All. I've been trying to setup
datahub-frontend
JaaS authentication with Kerberos. I'm providing a custom
jaas.conf
file via k8s configmap, volume mounted in the container at the path specified here - https://datahubproject.io/docs/how/auth/jaas#custom-jaas-configuration. But no matter what
jaas.conf
file I provide (even the default one with PropertyFileLoginModule) the app fails to boot up with an error that doesn't help much debug the issue. Full error in the thread.
Copy code
Oops, cannot start the server.
com.google.inject.CreationException: Unable to create injector, see the following errors:

1) No implementation for com.linkedin.entity.client.EntityClient was bound.
  while locating com.linkedin.entity.client.EntityClient
    for the 3rd parameter of controllers.SsoCallbackController.<init>(SsoCallbackController.java:39)
  while locating controllers.SsoCallbackController
    for the 4th parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

2) Could not find a suitable constructor in client.AuthServiceClient. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
  at client.AuthServiceClient.class(AuthServiceClient.java:22)
  while locating client.AuthServiceClient
    for field at controllers.AuthenticationController._authClient(AuthenticationController.java:45)
  while locating controllers.AuthenticationController
    for the 3rd parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

3) Could not find a suitable constructor in client.AuthServiceClient. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
  at client.AuthServiceClient.class(AuthServiceClient.java:22)
  while locating client.AuthServiceClient
    for the 4th parameter of controllers.SsoCallbackController.<init>(SsoCallbackController.java:39)
  while locating controllers.SsoCallbackController
    for the 4th parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

4) Could not find a suitable constructor in com.datahub.authentication.Authentication. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
  at com.datahub.authentication.Authentication.class(Authentication.java:21)
  while locating com.datahub.authentication.Authentication
    for the 2nd parameter of controllers.SsoCallbackController.<init>(SsoCallbackController.java:39)
  while locating controllers.SsoCallbackController
    for the 4th parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

5) No implementation for org.pac4j.core.context.session.SessionStore was bound.
  while locating org.pac4j.core.context.session.SessionStore
    for field at controllers.AuthenticationController._playSessionStore(AuthenticationController.java:45)
  while locating controllers.AuthenticationController
    for the 3rd parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

6) No implementation for org.pac4j.play.store.PlaySessionStore was bound.
  while locating org.pac4j.play.store.PlaySessionStore
    for field at org.pac4j.play.LogoutController.playSessionStore(LogoutController.java:28)
  while locating controllers.CentralLogoutController
    for the 5th parameter of router.Routes.<init>(Routes.scala:45)
  at play.api.inject.RoutesProvider$.bindingsFromConfiguration(BuiltinModule.scala:121):
Binding(class router.Routes to self) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)

6 errors
	at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:543)
	at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:159)
	at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106)
	at com.google.inject.Guice.createInjector(Guice.java:87)
	at com.google.inject.Guice.createInjector(Guice.java:78)
	at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:185)
	at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:137)
	at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
	at play.core.server.ProdServerStart$.start(ProdServerStart.scala:51)
	at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25)
	at play.core.server.ProdServerStart.main(ProdServerStart.scala)
h
cc: @big-carpet-38439
a
I believe the issue is due to volume mounting in k8s. I'm trying to mount a volume in an already existing path in the container, with just a single jaas.conf file in
datahub-frontend/conf/
. The mounting behavior in k8s is that it removes all existing files in the location. Faced the same issue when trying to use a custom user.props file as well.
Due to this limitation, we need to add the custom conf files, build our own image and then deploy. This could be simplified if we separated out the paths for default and custom conf. I propose having all default confs in
Copy code
datahub-frontend/conf/default/
and all custom go in
Copy code
datahub-frontend/conf/custom/
The files in
custom
folder would take precedence over the
default
ones (if present). With this separated conf structure, we could just volume mount the custom conf files without requiring to build an image ourselves.