Uploaded image for project: 'Brooklyn'
  1. Brooklyn
  2. BROOKLYN-410

Rebind fails in karaf, with app creating location from class in bundle

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 0.11.0
    • None

    Description

      With brooklyn 0.10.0-SNAPSHOT...

      A customer has an advanced/unusual Java-based app that programmatically adds a location to an entity. They are switching to using karaf.

      The app deploys successfully. However, on rebind it fails because it fails to instantiate the location (fails to load the class for the location).

      I reproduced this with a simpler test case - output shown below:

      2016-12-14 13:49:16,912 WARN  Rebind: continuing after problem creating LOCATION pjt0hzet8u of type com.acme.autobrick:com.acme.location.MyLocation
      org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: 
      	at org.apache.brooklyn.util.exceptions.Exceptions.propagate(Exceptions.java:129) ~[classes/:na]
      Caused by: java.lang.ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at org.apache.brooklyn.util.core.ClassLoaderUtils.loadClass(ClassLoaderUtils.java:155) ~[classes/:na]
      
      ...
      
      org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: Failure rebinding: problem creating LOCATION pjt0hzet8u of type com.acme.autobrick:com.acme.location.MyLocation: ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at org.apache.brooklyn.util.exceptions.Exceptions.propagate(Exceptions.java:129)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.rebind(RebindManagerImpl.java:513)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils.rebindAll(RebindTestUtils.java:457)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindTestUtils.rebind(RebindTestUtils.java:334)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindTestFixture.rebind(RebindTestFixture.java:303)
      	at org.apache.brooklyn.camp.brooklyn.AbstractYamlRebindTest.rebind(AbstractYamlRebindTest.java:87)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindTestFixture.rebind(RebindTestFixture.java:238)
      	at org.apache.brooklyn.camp.brooklyn.catalog.CatalogOsgiVersionMoreEntityRebindTest.testFoo(CatalogOsgiVersionMoreEntityRebindTest.java:143)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:606)
      	at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
      	at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
      	at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
      	at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
      	at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
      	at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
      	at org.testng.TestRunner.privateRun(TestRunner.java:782)
      	at org.testng.TestRunner.run(TestRunner.java:632)
      	at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
      	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
      	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
      	at org.testng.SuiteRunner.run(SuiteRunner.java:268)
      	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
      	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
      	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
      	at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
      	at org.testng.TestNG.run(TestNG.java:1064)
      	at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
      	at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)
      	at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:81)
      Caused by: java.util.concurrent.ExecutionException: org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: Failure rebinding: problem creating LOCATION pjt0hzet8u of type com.acme.autobrick:com.acme.location.MyLocation: ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
      	at java.util.concurrent.FutureTask.get(FutureTask.java:188)
      	at com.google.common.util.concurrent.ForwardingFuture.get(ForwardingFuture.java:63)
      	at org.apache.brooklyn.util.core.task.BasicTask.get(BasicTask.java:361)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.rebind(RebindManagerImpl.java:511)
      	... 30 more
      Caused by: org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: Failure rebinding: problem creating LOCATION pjt0hzet8u of type com.acme.autobrick:com.acme.location.MyLocation: ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at org.apache.brooklyn.util.exceptions.Exceptions.create(Exceptions.java:432)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onDoneImpl(RebindExceptionHandlerImpl.java:497)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onDone(RebindExceptionHandlerImpl.java:413)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration.run(RebindIteration.java:268)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl.rebindImpl(RebindManagerImpl.java:558)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:508)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindManagerImpl$3.call(RebindManagerImpl.java:506)
      	at org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:522)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      	at java.lang.Thread.run(Thread.java:745)
      Caused by: java.lang.IllegalStateException: problem creating LOCATION pjt0hzet8u of type com.acme.autobrick:com.acme.location.MyLocation
      	at org.apache.brooklyn.core.mgmt.rebind.RebindExceptionHandlerImpl.onCreateFailed(RebindExceptionHandlerImpl.java:265)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration.instantiateLocationsAndEntities(RebindIteration.java:441)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration.doRun(RebindIteration.java:240)
      	at org.apache.brooklyn.core.mgmt.rebind.InitialFullRebindIteration.doRun(InitialFullRebindIteration.java:69)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration.run(RebindIteration.java:266)
      	... 8 more
      Caused by: org.apache.brooklyn.util.exceptions.PropagatedRuntimeException: ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at org.apache.brooklyn.util.exceptions.Exceptions.propagate(Exceptions.java:129)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.loadClass(RebindIteration.java:999)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.newLocation(RebindIteration.java:1007)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration.instantiateLocationsAndEntities(RebindIteration.java:438)
      	... 11 more
      Caused by: java.lang.ClassNotFoundException: Class com.acme.autobrick:com.acme.location.MyLocation not found on the application class path, nor in the bundle white list.
      	at org.apache.brooklyn.util.core.ClassLoaderUtils.loadClass(ClassLoaderUtils.java:155)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.loadClass(RebindIteration.java:991)
      	at org.apache.brooklyn.core.mgmt.rebind.RebindIteration$BrooklynObjectInstantiator.loadClass(RebindIteration.java:997)
      	... 13 more
      

      Looking at the persisted state for the location, it looks good: <type>com.acme.autobrick:com.acme.location.MyLocation</type> and <catalogItemId>with-private-location:1.0</catalogItemId>.

      Looking at the code path in the stacktrace above, the loading of locations differs from entities. That calls RebindIteration.BrooklynObjectInstantiator.load(), which tries to use the catalog id. However, for locations it calls straight to RebindIteration.BrooklynObjectInstantiator.loadClass(), which does not respect the catalog id.

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              aled.sage Aled Sage
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: