]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: fix flex-algo northbound configuration 16772/head
authorLouis Scalbert <louis.scalbert@6wind.com>
Mon, 9 Sep 2024 12:32:00 +0000 (14:32 +0200)
committerLouis Scalbert <louis.scalbert@6wind.com>
Mon, 9 Sep 2024 12:37:47 +0000 (14:37 +0200)
ISIS flex-algo cannot be configured in the same northbound transaction.

> # cat config3
> router isis 1
>  flex-algo 129
>   priority 128
>
> # vtysh -f config3
> % Configuration failed.
>
> Error type: validation
> The following commands were dynamically grouped into the same transaction and rejected:
> - router isis 1
> - flex-algo 129
> - priority 128
> [1523430|isisd] done

Do not check data presence in running datastore in validation state.

Fixes: 893882ee20 ("isisd: add isis flex-algo configuration backend")
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
isisd/isis_nb_config.c

index 36aee11f0bf06208d32eef5580a8ce8db0c6659f..7286a692f596efa5a956c0fc2807a729fddbf0e9 100644 (file)
@@ -3156,19 +3156,16 @@ int isis_instance_flex_algo_affinity_exclude_any_destroy(
 int isis_instance_flex_algo_prefix_metric_create(struct nb_cb_create_args *args)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3191,19 +3188,17 @@ int isis_instance_flex_algo_prefix_metric_destroy(
        struct nb_cb_destroy_args *args)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3226,19 +3221,17 @@ static int isis_instance_flex_algo_dplane_set(struct nb_cb_create_args *args,
                                              int type)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3268,19 +3261,17 @@ static int isis_instance_flex_algo_dplane_unset(struct nb_cb_destroy_args *args,
                                                int type)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3350,21 +3341,19 @@ int isis_instance_flex_algo_dplane_ip_destroy(struct nb_cb_destroy_args *args)
 int isis_instance_flex_algo_metric_type_modify(struct nb_cb_modify_args *args)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
        enum flex_algo_metric_type metric_type;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
        metric_type = yang_dnode_get_enum(args->dnode, NULL);
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3390,21 +3379,19 @@ int isis_instance_flex_algo_metric_type_modify(struct nb_cb_modify_args *args)
 int isis_instance_flex_algo_priority_modify(struct nb_cb_modify_args *args)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
        uint32_t priority;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
        priority = yang_dnode_get_uint32(args->dnode, NULL);
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,
@@ -3426,21 +3413,19 @@ int isis_instance_flex_algo_priority_modify(struct nb_cb_modify_args *args)
 int isis_instance_flex_algo_priority_destroy(struct nb_cb_destroy_args *args)
 {
        struct isis_area *area;
-       const char *area_tag;
        struct flex_algo *fa;
        uint32_t algorithm;
        uint32_t priority = FLEX_ALGO_PRIO_DEFAULT;
 
-       area_tag = yang_dnode_get_string(args->dnode, "../../../area-tag");
-       area = isis_area_lookup(area_tag, VRF_DEFAULT);
-       if (!area)
-               return NB_ERR_RESOURCE;
-
        algorithm = yang_dnode_get_uint32(args->dnode, "../flex-algo");
        priority = yang_dnode_get_uint32(args->dnode, NULL);
 
        switch (args->event) {
        case NB_EV_APPLY:
+               area = nb_running_get_entry(args->dnode, NULL, true);
+               if (!area)
+                       return NB_ERR_RESOURCE;
+
                fa = flex_algo_lookup(area->flex_algos, algorithm);
                if (!fa) {
                        snprintf(args->errmsg, args->errmsg_len,