2017-11-10 6 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; 
     } 
    } 
    } 

자바 코드

@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 번들을 사용하여 클러스터 노드 대신 하나의 ODL에만 기능 odl-toaster를 설치했습니다. odl-toaster에서 rpc가 단일 노드에서 제대로 작동하고있는 것 같습니다.

+0

RPC 구현을 어떻게 등록합니까? 청사진 XML 파일은 어떻게 생겼습니까? –

+0

도움을 주셔서 감사합니다. BindingAwareBroker.RpcRegistration rpcProviderRegistry.addRpcImplementation (TestDataBrokerService.class) 및 <참조 ID = "dataBroker" 인터페이스 = "org.opendaylight.controller.md.sal.binding.api.DataBroker" ODL : TYPE = "기본"/> – HAO

답변

0

rpc도 클러스터되어 있다는 것을 알지 못했습니다. 때때로 rpc 요청은 동일한 번들을 배포하지 않은 다른 노드에서 실행됩니다. 이제 번들이 각 노드에서 파생 된 후에 문제가 해결되었습니다.