Как решить 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 databroker для сохранения данных в памяти и, наконец, проверьте, могут ли данные быть успешно скопированы в другие узлы кластера.

Ян файл:

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 работает правильно на одном узле.

1 ответ

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

Другие вопросы по тегам