oracle-cloud-infrastructureoci-java-sdk

Can't create instance from java sdk


I am trying to create an OCI instance with the Java SDK. I am getting an error in routeRules.

When I commented the following line, I was able to create an instance. But in that machines route is not enabled.

addInternetGatewayToRouteTable(vcnClient, compartmentId, vcn.getDefaultRouteTableId(), internetGateway);

https://github.com/oracle/oci-java-sdk/blob/master/bmc-examples/src/main/java/CreateInstanceExample.java

Exception in thread "main" com.oracle.bmc.model.BmcException: (400, InvalidParameter, false) routeRules[0].networkEntityId may not be null (opc-request-id: 6BC8A182852240F8AFFD1EB279CFF901/AD5BF82603D64DA298976FCFE83871F6/9398B04078B0435A8FA68FEA7307CC99)
        at com.oracle.bmc.http.internal.ResponseHelper.throwIfNotSuccessful(ResponseHelper.java:120)
        at com.oracle.bmc.http.internal.ResponseConversionFunctionFactory$ValidatingParseResponseFunction.apply(ResponseConversionFunctionFactory.java:86)
        at com.oracle.bmc.http.internal.ResponseConversionFunctionFactory$ValidatingParseResponseFunction.apply(ResponseConversionFunctionFactory.java:82)
        at com.oracle.bmc.core.internal.http.UpdateRouteTableConverter$1.apply(UpdateRouteTableConverter.java:70)
        at com.oracle.bmc.core.internal.http.UpdateRouteTableConverter$1.apply(UpdateRouteTableConverter.java:55)
        at com.oracle.bmc.core.VirtualNetworkClient.updateRouteTable(VirtualNetworkClient.java:3325)
        at CreateInstanceExample.addInternetGatewayToRouteTable(CreateInstanceExample.java:295)
        at CreateInstanceExample.main(CreateInstanceExample.java:146)

Solution

  • There is a bug in the code, you can replace destination in the addInternetGatewayToRouteTable(..) method

            RouteRule internetAccessRoute =
                    RouteRule.builder()
                            .cidrBlock("0.0.0.0/0")
                            .destination(internetGateway.getId())
                            .build();
    
    

    in line 295 with networkEntityId:

            RouteRule internetAccessRoute =
                    RouteRule.builder()
                            .cidrBlock("0.0.0.0/0")
                            .networkEntityId(internetGateway.getId())
                            .build();
    

    You can see from the REST APIs here which parameters are required to create a route rule in a route table.

    The example seems to be based on a deprecated version of calling the RouteRule builder.