sysrepo и XPATH: пространства имен модуля YANG в плагинах для запуска конфигурации - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь написать плагин для модуля YANG (ieee802-dot1q-bridge.yang). К сожалению, я с трудом пытаюсь правильно настроить подписчиков, поскольку мне приходится правильно включать пространства имен.

Это мой код:

#include <stdio.h>
#include <syslog.h>
#include "sysrepo.h"
#include "sysrepo/values.h"
#include "sysrepo/plugins.h"

static int
module_change_cb(sr_session_ctx_t *session, const char *module_name, sr_notif_event_t event, void *private_ctx)
{
    SRP_LOG_DBG_MSG("turing-machine configuration has changed.");
    printf("in module change cb\n");
    return SR_ERR_OK;
}

static int
bridge_state_cb(const char *xpath, sr_val_t **values, size_t *values_cnt,
        uint64_t request_id, const char *original_xpath, void *private_ctx)
{
    return 1;
    sr_val_t *vals;
    int rc;

    printf("setting a new value\n");
    sr_new_values(1, &vals);
    if (SR_ERR_OK != rc) {
            return rc;
    }
    sr_val_set_xpath(&vals[0], "/ieee802-dot1q-bridge/bridges/bridge/name");
    vals[0].type = SR_STRING_T;
    vals[0].data.string_val = "Test";

    *values = vals;
    *values_cnt = 1;
    return SR_ERR_OK;
}

int
sr_plugin_init_cb(sr_session_ctx_t *session, void **private_ctx)
{

    printf("initializinig:\n");
    sr_subscription_ctx_t *subscription = NULL;
    int rc = SR_ERR_OK;

    printf("try first subscription\n");
    rc = sr_module_change_subscribe(session, "ieee802-dot1q-bridge:bridges", module_change_cb, NULL,
            0, SR_SUBSCR_DEFAULT, &subscription);
    if (SR_ERR_OK != rc) {
        goto error;
    } else {
        printf("subscription ok!\n");
    }


    printf("Trying state data subscription...\n");
    rc = sr_dp_get_items_subscribe(session, "/ieee802-dot1q-bridge:bridges", bridge_state_cb, NULL,
                SR_SUBSCR_DEFAULT, &subscription);
    if (rc != SR_ERR_OK) {
        goto error;
    } else {
        printf("state data subscription ok!\n");
    }

    //printf("Erfolgreiche initialisierung");
    SRP_LOG_DBG_MSG("plugin initialized successfully");

    /* set subscription as our private context */
    *private_ctx = subscription;

    return SR_ERR_OK;

    error:
        SRP_LOG_ERR("ieee802-dot1q-bridge plugin initialization failed: %s", sr_strerror(rc));
        sr_unsubscribe(session, subscription);
        return rc;
}

void
sr_plugin_cleanup_cb(sr_session_ctx_t *session, void *private_ctx)
{
    sr_unsubscribe(session, private_ctx);
    SRP_LOG_DBG_MSG("bridge plugin cleanup finished.");
}

Я включил необходимые функции для инициализации и очистки. Кажется, ошибка в том, что XPATH в подписчиках установлен неправильно.

sr_module_change_subscribe(session, "ieee802-dot1q-bridge:bridges", module_change_cb, NULL,
            0, SR_SUBSCR_DEFAULT, &subscription);

Я думаю, что мне нужно как-то включить пространство имен, которое называется urn: ieee: std: 802.1Q: yang: ieee802-dot1q-bridge. К сожалению, я не нашел пути в документации sysrepo. Я искал что-то вроде пространства имен dict в ncclient, но ничего не нашел.

Как правильно установить пространство имен? Есть ли более простой способ предоставить sysrepo начальные данные? Я не хочу изменять модель Ян.

...