2017-11-10 5 views
0

yangファイルとInstanceIdentifierを何度も変更した後、MD-SALのDatabrokerを使用してデータリストを保存しようとしていますが、SchemaValidationFailedExceptionを解決する方法:子がスキーマに存在しない

java.util.concurrent.ExecutionException: TransactionCommitFailedException{message=canCommit encountered an unexpected failure, errorList=[RpcError [message=canCommit encountered an unexpected failure, severity=ERROR, errorType=APPLICATION, tag=operation-failed, applicationTag=null, info=null, cause=org.opendaylight.yangtools.yang.data.impl.schema.tree.SchemaValidationFailedException: Child /(urn:opendaylight:params:xml:ns:yang:testDataBroker?revision=2015-01-05)service-datas is not present in schema tree.]]} at org.opendaylight.yangtools.util.concurrent.MappingCheckedFuture.wrapInExecutionExc

私の目標は、RPCセーブ・デバイスの情報を他の部分からデータを取得するために使用することです。次にdatabroker apiを使用してデータをメモリに保存し、最後にデータが他のクラスタノードに正常に複製できるかどうかをテストします。

ヤンファイル:

module testDataBroker { 
    yang-version 1; 
    namespace "urn:opendaylight:params:xml:ns:yang:testDataBroker"; 
    prefix "testDataBroker"; 

    revision "2015-01-05" { 
    description "Initial revision of testDataBroker model"; 
    } 

    container service-datas { 
    list service-data { 
     key "service-id"; 
     uses service-id; 
     uses device-info; 
     } 
    } 

    grouping device-info { 
    container device-info { 
     leaf device-name { 
      type string; 
      config false; 
     } 

     leaf device-description { 
      type string; 
      config false; 
     } 
     } 
    } 

    grouping service-id { 
    leaf service-id { 
     type string; 
     mandatory true; 
    } 
    } 

    rpc save-device-info { 
    input { 
     uses service-id; 
     uses device-info; 
    } 
    output { 
     uses device-info; 
    } 
    } 

    rpc get-device-info { 
     output { 
     uses device-info; 
     } 
    } 
    } 

Javaコード

@Override public Future<RpcResult<SaveDeviceInfoOutput>> saveDeviceInfo(SaveDeviceInfoInput input) { 
     String name = input.getDeviceInfo().getDeviceName(); 
     String description = input.getDeviceInfo().getDeviceDescription(); 
     String serviceId = input.getServiceId(); 

     WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction(); 
     DeviceInfo deviceInfo = new DeviceInfoBuilder().setDeviceDescription(description).setDeviceName(name).build(); 
     ServiceData serviceData = new ServiceDataBuilder().setServiceId(serviceId).setDeviceInfo(deviceInfo).build(); 
     InstanceIdentifier<ServiceData> instanceIdentifier = 
     InstanceIdentifier.builder(ServiceDatas.class).child(ServiceData.class, serviceData.getKey()).build(); 

     writeTransaction.put(LogicalDatastoreType.CONFIGURATION, instanceIdentifier, serviceData, true); 

     boolean isFailed = false; 
     try { 
      writeTransaction.submit().get(); 
      log.info("Create containers succeeded!"); 

     } catch (InterruptedException | ExecutionException e) { 
      log.error("Create containers failed: ", e); 
      isFailed = true; 
     } 

     return isFailed ? 
     RpcResultBuilder.success(new SaveDeviceInfoOutputBuilder()) 
      .withError(RpcError.ErrorType.RPC, "Create container failed").buildFuture() : 
     RpcResultBuilder.success(new SaveDeviceInfoOutputBuilder().setDeviceInfo(input.getDeviceInfo())) 
      .buildFuture(); 
} 

は本当にあなたの助けを必要としています。ありがとう。

更新: 同じバージョンのmd-salバンドルでは、クラスターノードの代わりに1つのODLにフィーチャーodl-toasterをインストールしました。 odl-toasterからのrpcが単一ノードで正常に動作しているようです。

+0

どのようにRPC実装を登録しますか?あなたの青写真のxmlファイルはどのように見えますか? –

+0

助けてくれてありがとう。 BindingAwareBroker.RpcRegistration rpcProviderRegistry.addRpcImplementation(TestDataBrokerService.class)および HAO

答えて

0

rpcもクラスタ化されていることはわかりませんでした。同じバンドルをデプロイしなかった他のノードでrpc要求がヒットすることがあります。現在、バンドルが各ノードで見つかった後、問題は解決されています。

関連する問題