Как решить SchemaValidationFailedException: дочерний элемент отсутствует в схеме

Я пытаюсь использовать Databroker MD-SAL для сохранения списка данных после многократных изменений файла 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 для получения данных из остальных. Затем используйте 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-toaster только на один ODL вместо узлов кластера. Похоже, что rpc от odl-toaster правильно работает на одном узле.


person HAO    schedule 10.11.2017    source источник
comment
Как зарегистрировать реализацию RPC? Как выглядит ваш XML-файл чертежа?   -  person Tama Yoshi    schedule 13.11.2017
comment
Спасибо за помощь. BindingAwareBroker.RpcRegistration‹?›rpcProviderRegistry.addRpcImplementation(TestDataBrokerService.class) и ‹reference id=dataBroker interface=org.opendaylight.controller.md.sal.binding.api.DataBroker odl:type=default/›   -  person HAO    schedule 13.11.2017


Ответы (1)


Я не знал, что rpc также кластеризован. Иногда запрос rpc попадал на другие узлы, на которых не были развернуты те же пакеты. Теперь проблема решена после того, как связка разобрана на каждом узле.

person HAO    schedule 13.11.2017