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가 단일 노드에서 제대로 작동하고있는 것 같습니다.
RPC 구현을 어떻게 등록합니까? 청사진 XML 파일은 어떻게 생겼습니까? –
도움을 주셔서 감사합니다. BindingAwareBroker.RpcRegistration > rpcProviderRegistry.addRpcImplementation (TestDataBrokerService.class) 및 <참조 ID = "dataBroker" 인터페이스 = "org.opendaylight.controller.md.sal.binding.api.DataBroker" ODL : TYPE = "기본"/> – HAO