opendaylight: сохранение укуса в MDSAL - PullRequest
0 голосов
/ 27 мая 2018

У меня есть модель YANG (известная MDSAL), которую я использую в приложении opendaylight.В моем приложении мне предоставляется строка в формате json, которую я хочу сохранить в базе данных MDSAL.Я мог бы использовать конструктор объекта, который я хочу сохранить, и установить его с полями, представленными в формате String в формате json, один за другим, но это трудоемко и подвержено ошибкам.

В качестве альтернативы я мог бы публиковать сообщения из приложения в Northbound API, который в конечном итоге будет писать в хранилище данных MDSAL.

Есть ли более простой способ сделать это?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Основываясь на информации выше, я построил следующее (которое я публикую здесь, чтобы помочь другим).Я до сих пор не знаю, как избавиться от устаревшей ссылки на SchemaService (возможно, кто-то может помочь).

 private void importFromNormalizedNode(final DOMDataReadWriteTransaction rwTrx, final LogicalDatastoreType type,
        final NormalizedNode<?, ?> data) throws TransactionCommitFailedException, ReadFailedException {
    if (data instanceof NormalizedNodeContainer) {
        @SuppressWarnings("unchecked")
        YangInstanceIdentifier yid = YangInstanceIdentifier.create(data.getIdentifier());
        rwTrx.put(type, yid, data);

    } else {
        throw new IllegalStateException("Root node is not instance of NormalizedNodeContainer");
    }
}

private void importDatastore(String jsonData, QName qname) throws TransactionCommitFailedException, IOException,
        ReadFailedException, SchemaSourceException, YangSyntaxErrorException {
    // create StringBuffer object

    LOG.info("jsonData = " + jsonData);

    byte bytes[] = jsonData.getBytes();
    InputStream is = new ByteArrayInputStream(bytes);

    final NormalizedNodeContainerBuilder<?, ?, ?, ?> builder = ImmutableContainerNodeBuilder.create()
            .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(qname));

    try (NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder)) {

        SchemaPath schemaPath = SchemaPath.create(true, qname);

        LOG.info("SchemaPath " + schemaPath);

        SchemaNode parentNode = SchemaContextUtil.findNodeInSchemaContext(schemaService.getGlobalContext(),
                schemaPath.getPathFromRoot());

        LOG.info("parentNode " + parentNode);

        try (JsonParserStream jsonParser = JsonParserStream.create(writer, schemaService.getGlobalContext(),
                parentNode)) {
            try (JsonReader reader = new JsonReader(new InputStreamReader(is))) {
                reader.setLenient(true);
                jsonParser.parse(reader);
                DOMDataReadWriteTransaction rwTrx = domDataBroker.newReadWriteTransaction();
                importFromNormalizedNode(rwTrx, LogicalDatastoreType.CONFIGURATION, builder.build());
            }
        }
    }

}
0 голосов
/ 28 мая 2018

Предполагая, что ваш входящий JSON точно соответствует структуре вашей модели YANG (не так ли?), Я считаю, что вам действительно нужно преобразовать этот JSON в «независимый от привязки» (не установщик сгенерированного Java-класса)внутренняя модель - NormalizedNode & Co. Где-то в проекте контроллера или mdsal есть класс «кодека», который может сделать это.

Вы можете искать как такой код, так и его использование (я вижу, что тестывсегда полезно) в исходном коде проектов контроллеров ODL и mdsal или в других проектах ODL, которые делают подобные вещи - я думаю, что я специально просматриваю источники проектов jsonrpc и daexim;в частности, похоже, что это может вдохновить вас: https://github.com/opendaylight/daexim/blob/stable/nitrogen/impl/src/main/java/org/opendaylight/daexim/impl/ImportTask.java

Удачи.

...