seqeralabs/tower-cli

GCP CE import/export returns Java reflection invoke public method errors

Closed this issue · 1 comments

When running tw compute-envs import or tw compute-envs export with GCP CEs using Fusion/Wave, the following error is returned:

tw compute-envs import --name $GCP_COMPUTE_ENV_NAME --workspace $SEQERA_ORGANIZATION_NAME/$SEQERA_WORKSPACE_NAME --credentials google_credentials --wait AVAILABLE ./examples/yaml/compute-envs/seqera_gcp_finland.json

  New GOOGLE-BATCH compute environment 'seqera_gcp_finland_fusion_seqerakit' added at [seqerakit_automation / e2e_demo] workspace

  Waiting AVAILABLE status...Exception in thread "main" org.graalvm.nativeimage.MissingReflectionRegistrationError: The program tried to reflectively invoke method public void io.seqera.tower.model.GoogleBatchConfig.setWaveEnabled(java.lang.Boolean) without it being registered for runtime reflection. Add it to the reflection metadata to solve this problem. See https://www.graalvm.org/latest/reference-manual/native-image/metadata/#reflection for help.
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils.forQueriedOnlyExecutable(MissingReflectionRegistrationUtils.java:97)
        at java.base@17.0.8/java.lang.reflect.Method.acquireMethodAccessor(Method.java:77)
        at java.base@17.0.8/java.lang.reflect.Method.invoke(Method.java:566)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:141)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:189)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:130)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97)
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:254)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1682)
        at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:977)
        at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:834)
        at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:363)
        at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:126)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
        at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)
        at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:123)
        at io.seqera.tower.ApiClient.deserialize(ApiClient.java:647)
        at io.seqera.tower.ApiClient.invokeAPI(ApiClient.java:826)
        at io.seqera.tower.api.DefaultApi.describeComputeEnvWithHttpInfo(DefaultApi.java:3504)
        at io.seqera.tower.api.DefaultApi.describeComputeEnv(DefaultApi.java:3448)
        at io.seqera.tower.cli.commands.computeenvs.add.AbstractAddCmd.checkComputeEnvStatus(AbstractAddCmd.java:91)
        at io.seqera.tower.cli.commands.computeenvs.add.AbstractAddCmd.lambda$onBeforeExit$0(AbstractAddCmd.java:81)
        at io.seqera.tower.cli.utils.ResponseHelper.waitStatus(ResponseHelper.java:153)
        at io.seqera.tower.cli.commands.computeenvs.add.AbstractAddCmd.onBeforeExit(AbstractAddCmd.java:76)
        at io.seqera.tower.cli.commands.AbstractApiCmd.call(AbstractApiCmd.java:409)
        at io.seqera.tower.cli.commands.AbstractApiCmd.call(AbstractApiCmd.java:59)
        at picocli.CommandLine.executeUserObject(CommandLine.java:1953)
        at picocli.CommandLine.access$1300(CommandLine.java:145)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2358)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2352)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2314)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2179)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2316)
        at picocli.CommandLine.execute(CommandLine.java:2078)
        at io.seqera.tower.cli.Tower.main(Tower.java:93)

Similarly for tw compute-envs export:

tw compute-envs export tower_cloud_testing_finland_fusionv2.json -n tower_cloud_testing_finland_fusionv2 -w scidev/gcp    
Exception in thread "main" org.graalvm.nativeimage.MissingReflectionRegistrationError: The program tried to reflectively invoke method public void io.seqera.tower.model.GoogleBatchConfig.setWaveEnabled(java.lang.Boolean) without it being registered for runtime reflection. Add it to the reflection metadata to solve this problem. See https://www.graalvm.org/latest/reference-manual/native-image/metadata/#reflection for help.
      at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils.forQueriedOnlyExecutable(MissingReflectionRegistrationUtils.java:97)
...        

This is currently preventing GCP CE creation via JSON using the CLI.

Versions:

    Details
  -------------------------+----------------------
   Tower API endpoint      | https://api.tower.nf
   Tower API version       | 1.23.0
   Tower version           | 23.3.0-cycle21
   CLI version             | 0.9.0 (0cea70d)
   CLI minimum API version | 1.15

tw compute-envs delete also seems to be similarly broken for GCP CEs in general:

$ tw compute-envs delete -n tower_cloud_testing_london_nofusionv2 -w scidev/gcp

Exception in thread "main" org.graalvm.nativeimage.MissingReflectionRegistrationError: The program tried to reflectively invoke method public void io.seqera.tower.model.GoogleBatchConfig.setWaveEnabled(java.lang.Boolean) without it being registered for runtime reflection. Add it to the reflection metadata to solve this problem. See https://www.graalvm.org/latest/reference-manual/native-image/metadata/#reflection for help.
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.reflect.MissingReflectionRegistrationUtils.forQueriedOnlyExecutable(MissingReflectionRegistrationUtils.java:97)
        at java.base@17.0.8/java.lang.reflect.Method.acquireMethodAccessor(Method.java:77)
        at java.base@17.0.8/java.lang.reflect.Method.invoke(Method.java:566)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:141)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:189)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:130)
        at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:97)
        at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:254)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
        at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1682)
        at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:977)
        at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:834)
        at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:363)
        at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:126)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
        at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)
        at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:123)
        at io.seqera.tower.ApiClient.deserialize(ApiClient.java:647)
        at io.seqera.tower.ApiClient.invokeAPI(ApiClient.java:826)
        at io.seqera.tower.api.DefaultApi.describeComputeEnvWithHttpInfo(DefaultApi.java:3504)
        at io.seqera.tower.api.DefaultApi.describeComputeEnv(DefaultApi.java:3448)
        at io.seqera.tower.cli.commands.computeenvs.AbstractComputeEnvCmd.computeEnvByName(AbstractComputeEnvCmd.java:51)
        at io.seqera.tower.cli.commands.computeenvs.DeleteCmd.exec(DeleteCmd.java:43)
        at io.seqera.tower.cli.commands.AbstractApiCmd.call(AbstractApiCmd.java:407)
        at io.seqera.tower.cli.commands.AbstractApiCmd.call(AbstractApiCmd.java:59)
        at picocli.CommandLine.executeUserObject(CommandLine.java:1953)
        at picocli.CommandLine.access$1300(CommandLine.java:145)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2358)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2352)
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2314)
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2179)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2316)
        at picocli.CommandLine.execute(CommandLine.java:2078)
        at io.seqera.tower.cli.Tower.main(Tower.java:93)