Add VES stndDefined PM and subscription for O-DU.
[sim/o1-interface.git] / ntsimulator / ntsim-ng / core / datastore / populate_late_resolve.c
1 /*************************************************************************
2 *
3 * Copyright 2021 highstreet technologies GmbH and others
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 ***************************************************************************/
17
18 #include "populate_internal.h"
19 #include "utils/log_utils.h"
20 #include "utils/rand_utils.h"
21 #include "utils/type_utils.h"
22
23 #include "core/datastore/schema.h"
24 #include "core/framework.h"
25 #include "core/session.h"
26
27 #include <sysrepo.h>
28 #include <libyang/libyang.h>
29
30 #include <stdlib.h>
31 #include <assert.h>
32
33 int populate_late_resolve_add_leaf(populate_job_t *job, populate_instance_t *instance, struct lys_node *schema, struct lyd_node *parent_d, struct lyd_node *parent_o, struct lyd_node *parent_r) {
34     assert(job);
35     assert(instance);
36
37     job->late_resolve_schema = (struct lys_node **)realloc(job->late_resolve_schema, (job->late_resolve_count + 1) * sizeof(struct lys_node *));
38     if(!job->late_resolve_schema) {
39         log_error("bad realloc\n");
40         return NTS_ERR_FAILED;
41     }
42     job->late_resolve_schema[job->late_resolve_count] = schema;
43
44     job->late_resolve_parent_d = (struct lyd_node **)realloc(job->late_resolve_parent_d, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
45     if(!job->late_resolve_parent_d) {
46         log_error("bad realloc\n");
47         return NTS_ERR_FAILED;
48     }
49     job->late_resolve_parent_d[job->late_resolve_count] = parent_d;
50
51     job->late_resolve_parent_o = (struct lyd_node **)realloc(job->late_resolve_parent_o, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
52     if(!job->late_resolve_parent_o) {
53         log_error("bad realloc\n");
54         return NTS_ERR_FAILED;
55     }
56     job->late_resolve_parent_o[job->late_resolve_count] = parent_o;
57
58     job->late_resolve_parent_r = (struct lyd_node **)realloc(job->late_resolve_parent_r, (job->late_resolve_count + 1) * sizeof(struct lyd_node *));
59     if(!job->late_resolve_parent_r) {
60         log_error("bad realloc\n");
61         return NTS_ERR_FAILED;
62     }
63     job->late_resolve_parent_r[job->late_resolve_count] = parent_r;
64
65     job->late_resolve_instance = (populate_instance_t **)realloc(job->late_resolve_instance, (job->late_resolve_count + 1) * sizeof(populate_instance_t *));
66     if(!job->late_resolve_instance) {
67         log_error("bad realloc\n");
68         return NTS_ERR_FAILED;
69     }
70     job->late_resolve_instance[job->late_resolve_count] = instance;
71
72     job->late_resolve_count++;
73
74     return NTS_ERR_OK;
75 }
76
77
78 int populate_late_resolve(populate_job_t *job) {
79     assert(job);
80
81     job->late_resolving = true;
82
83     int prev_count = job->late_resolve_count + 1;
84
85     while(prev_count > job->late_resolve_count) {
86         int late_resolve_count = job->late_resolve_count;
87         struct lys_node **late_resolve_schema = job->late_resolve_schema;
88         struct lyd_node **late_resolve_parent_d = job->late_resolve_parent_d;
89         struct lyd_node **late_resolve_parent_o = job->late_resolve_parent_o;
90         struct lyd_node **late_resolve_parent_r = job->late_resolve_parent_r;
91         populate_instance_t **late_resolve_instance = job->late_resolve_instance;
92         
93         job->late_resolve_count = 0;
94         job->late_resolve_schema = 0;
95         job->late_resolve_parent_d = 0;
96         job->late_resolve_parent_o = 0;
97         job->late_resolve_parent_r = 0;
98         job->late_resolve_instance = 0;
99
100         prev_count = late_resolve_count;
101
102         for(int i = 0; i < late_resolve_count; i++) {
103             log_add_verbose(1, LOG_COLOR_BOLD_YELLOW"late-populating "LOG_COLOR_RESET": ");
104             int rc = populate_add_leaf(job, late_resolve_instance[i], late_resolve_schema[i], late_resolve_parent_d[i], late_resolve_parent_o[i], late_resolve_parent_r[i]);
105             if(rc != NTS_ERR_OK) {
106                 log_error("populate_add_leaf failed on late-resolve\n");
107                 return rc;
108             }
109         }
110
111         free(late_resolve_schema);
112         free(late_resolve_parent_d);
113         free(late_resolve_parent_o);
114         free(late_resolve_parent_r);
115         free(late_resolve_instance);
116     }
117     job->late_resolving = false;
118
119     if(prev_count != 0) {
120         log_error("populate_late_resolve detected circular loop!\n");
121     }
122
123     return NTS_ERR_OK;
124 }