【问题标题】:How to solve SchemaValidationFailedException: Child is not present in schema如何解决 Schema ValidationFailedException: Child is not present in schema
【发布时间】:2017-11-14 04:32:39
【问题描述】:

我正在尝试使用 MD-SAL 的 Databroker 来保存数据列表,在多次修改 yang 文件和 InstanceIdentifier 但总是面临类似的验证问题后,例如

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 save-device-info 从休息中获取数据。然后使用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 包,我只在一个 ODL 而不是集群节点上安装了功能 odl-toaster。来自 odl-toaster 的 rpc 似乎在单个节点上正常工作。

【问题讨论】:

  • 如何注册您的 RPC 实现?你的蓝图 xml 文件是什么样的?
  • 感谢您的帮助。 BindingAwareBroker.RpcRegistration>rpcProviderRegistry.addRpcImplementation(TestDataBrokerService.class) 和

标签: opendaylight ietf-netmod-yang


【解决方案1】:

我没有意识到 rpc 也是集群的。有时 rpc 请求会命中未部署相同捆绑包的其他节点。现在在每个节点上分发bundle后问题已经解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 2022-12-02
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多