Motr  M0
diter.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2015-2020 Seagate Technology LLC and/or its Affiliates
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  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_UT
24 #include "lib/trace.h"
25 
26 #include "conf/diter.h"
27 #include "conf/obj_ops.h" /* M0_CONF_DIRNEXT */
28 #include "conf/ut/common.h" /* m0_conf_ut_grp */
29 #include "conf/ut/rpc_helpers.h" /* m0_ut_rpc_machine_start */
30 #include "rpc/rpclib.h" /* m0_rpc_server_ctx */
31 #include "lib/fs.h" /* m0_file_read */
32 #include "lib/memory.h" /* m0_free */
33 #include "ut/misc.h" /* M0_UT_PATH, M0_UT_CONF_PROCESS */
34 #include "ut/ut.h"
35 
36 enum {
38  FS,
74 };
75 
76 static const struct m0_fid fids[] = {
77  [PROF] = M0_FID_TINIT('p', 1, 0),
78  [FS] = M0_FID_TINIT('f', 1, 1),
79  [NODE] = M0_FID_TINIT('n', 1, 2),
80  [PROCESS0] = M0_FID_TINIT('r', 1, 5),
81  [SERVICE0] = M0_FID_TINIT('s', 1, 0),
82  [SERVICE1] = M0_FID_TINIT('s', 1, 1),
83  [SERVICE2] = M0_FID_TINIT('s', 1, 2),
84  [SERVICE3] = M0_FID_TINIT('s', 1, 3),
85  [SERVICE4] = M0_FID_TINIT('s', 1, 4),
86  [SERVICE5] = M0_FID_TINIT('s', 1, 5),
87  [SERVICE6] = M0_FID_TINIT('s', 1, 6),
88  [SERVICE7] = M0_FID_TINIT('s', 1, 7),
89  [SERVICE8] = M0_FID_TINIT('s', 1, 8),
90  [SDEV0] = M0_FID_TINIT('d', 1, 10),
91  [SDEV1] = M0_FID_TINIT('d', 1, 11),
92  [SDEV2] = M0_FID_TINIT('d', 1, 12),
93  [SDEV3] = M0_FID_TINIT('d', 1, 13),
94  [SDEV4] = M0_FID_TINIT('d', 1, 14),
95  [RACK] = M0_FID_TINIT('a', 1, 15),
96  [ENCLOSURE] = M0_FID_TINIT('e', 1, 16),
97  [CONTROLLER] = M0_FID_TINIT('c', 1, 17),
98  [DISK0] = M0_FID_TINIT('k', 1, 18),
99  [DISK1] = M0_FID_TINIT('k', 1, 19),
100  [DISK2] = M0_FID_TINIT('k', 1, 20),
101  [DISK3] = M0_FID_TINIT('k', 1, 21),
102  [DISK4] = M0_FID_TINIT('k', 1, 22),
103  [POOL] = M0_FID_TINIT('o', 1, 23),
104  [PVER] = M0_FID_TINIT('v', 1, 24),
105  [RACKV] = M0_FID_TINIT('j', 1, 25),
106  [ENCLOSUREV] = M0_FID_TINIT('j', 1, 26),
107  [CONTROLLERV] = M0_FID_TINIT('j', 1, 27),
108  [DISKV0] = M0_FID_TINIT('j', 1, 28),
109  [DISKV1] = M0_FID_TINIT('j', 1, 29),
110  [DISKV2] = M0_FID_TINIT('j', 1, 30),
111  [DISKV3] = M0_FID_TINIT('j', 1, 31),
112  [DISKV4] = M0_FID_TINIT('j', 1, 32),
113  [UNKNOWN_SVC] = M0_FID_TINIT('s', 5, 33),
114 };
115 
116 static void verify_obj(const struct m0_conf_obj *obj, const struct m0_fid *fid)
117 {
118  M0_UT_ASSERT(obj->co_status == M0_CS_READY);
119  M0_UT_ASSERT(m0_fid_eq(&obj->co_id, fid));
120 }
121 
122 static void verify_node(const struct m0_conf_obj *obj)
123 {
124  const struct m0_conf_node *node = M0_CONF_CAST(obj, m0_conf_node);
125 
126  verify_obj(obj, &fids[NODE]);
127  M0_UT_ASSERT(node->cn_memsize == 16000);
128  M0_UT_ASSERT(node->cn_nr_cpu == 2);
129  M0_UT_ASSERT(node->cn_last_state == 3);
130  M0_UT_ASSERT(node->cn_flags == 2);
131 }
132 
133 static void verify_disk(const struct m0_conf_obj *obj)
134 {
135  static const struct m0_fid *a[] = {
136  &fids[DISK0], &fids[DISK1], &fids[DISK2],
137  &fids[DISK3], &fids[DISK4]
138  };
139  M0_UT_ASSERT(obj->co_status == M0_CS_READY);
140  M0_UT_ASSERT(m0_exists(i, ARRAY_SIZE(a), m0_fid_eq(&obj->co_id, a[i])));
141 }
142 
143 static void check_objv(const struct m0_conf_obj *obj)
144 {
145  const struct m0_conf_obj *r = M0_CONF_CAST(obj, m0_conf_objv)->cv_real;
146  const struct m0_conf_obj_type *t = m0_conf_obj_type(r);
147 
148  if (t == &M0_CONF_RACK_TYPE)
149  verify_obj(r, &fids[RACK]);
150  else if (t == &M0_CONF_ENCLOSURE_TYPE)
152  else if (t == &M0_CONF_CONTROLLER_TYPE)
154  else if (t == &M0_CONF_DRIVE_TYPE)
155  verify_disk(r);
156 }
157 
158 static void check_obj(const struct m0_conf_obj *obj)
159 {
160  const struct m0_conf_obj_type *t = m0_conf_obj_type(obj);
161 
162  if (t == &M0_CONF_OBJV_TYPE) {
163  check_objv(obj);
164  } else if (t == &M0_CONF_RACK_TYPE) {
165  verify_obj(obj, &fids[RACK]);
166  } else if (t == &M0_CONF_ENCLOSURE_TYPE) {
168  } else if (t == &M0_CONF_CONTROLLER_TYPE) {
170  } else if (t == &M0_CONF_DRIVE_TYPE) {
171  verify_disk(obj);
172  } else if (t == &M0_CONF_PVER_TYPE) {
173  verify_obj(obj, &fids[PVER]);
174  } else if (t == &M0_CONF_NODE_TYPE) {
175  verify_node(obj);
176  } else if (t == &M0_CONF_PROCESS_TYPE) {
177  M0_UT_ASSERT(m0_fid_eq(&obj->co_id, &fids[PROCESS0]));
178  } else if (t == &M0_CONF_SERVICE_TYPE) {
179  static const struct m0_fid *a[] = {
180  &fids[SERVICE0], &fids[SERVICE1],
181  &fids[SERVICE2], &fids[SERVICE3],
182  &fids[SERVICE4], &fids[SERVICE5],
183  &fids[SERVICE6], &fids[SERVICE7],
184  &fids[SERVICE8]
185  };
187  m0_fid_eq(&obj->co_id, a[i])));
188  } else if (t == &M0_CONF_SDEV_TYPE) {
189  static const struct m0_fid *a[] = {
190  &fids[SDEV0], &fids[SDEV1], &fids[SDEV2],
191  &fids[SDEV3], &fids[SDEV4]
192  };
194  m0_fid_eq(&obj->co_id, a[i])));
195  }
196 }
197 
198 static bool _filter_diskv(const struct m0_conf_obj *obj)
199 {
200  return (m0_conf_obj_type(obj) == &M0_CONF_OBJV_TYPE &&
203 }
204 
205 static void
207 {
208  struct m0_conf_diter it;
209  struct m0_conf_obj *obj;
210  struct m0_conf_objv *ov;
211  struct m0_conf_service *s;
212  struct m0_conf_drive *d;
213  int rc;
214 
216  M0_CONF_ROOT_POOLS_FID,
217  M0_CONF_POOL_PVERS_FID,
218  M0_CONF_PVER_SITEVS_FID,
219  M0_CONF_SITEV_RACKVS_FID,
220  M0_CONF_RACKV_ENCLVS_FID,
221  M0_CONF_ENCLV_CTRLVS_FID,
222  M0_CONF_CTRLV_DRIVEVS_FID);
223  M0_UT_ASSERT(rc == 0);
224 
225  while ((rc = m0_conf_diter_next_sync(&it, _filter_diskv)) ==
226  M0_CONF_DIRNEXT) {
232  check_obj(&d->ck_obj);
235  check_obj(&s->cs_obj);
236  };
237 
239  M0_UT_ASSERT(rc == 0);
240 }
241 
242 static void
244 {
245  struct m0_conf_diter it;
246  int rc;
247 
249  M0_CONF_ROOT_SITES_FID,
250  M0_CONF_SITE_RACKS_FID,
251  M0_CONF_RACK_ENCLS_FID,
252  M0_CONF_ENCLOSURE_CTRLS_FID,
253  M0_CONF_CONTROLLER_DRIVES_FID);
254  M0_UT_ASSERT(rc == 0);
255 
258 
260  M0_UT_ASSERT(rc == 0);
261 }
262 
263 static bool _filter_service(const struct m0_conf_obj *obj)
264 {
266 }
267 
269  struct m0_conf_obj *root, bool filter)
270 {
271  struct m0_conf_diter it;
272  int rc;
273 
275  M0_CONF_ROOT_NODES_FID,
276  M0_CONF_NODE_PROCESSES_FID,
277  M0_CONF_PROCESS_SERVICES_FID,
278  M0_CONF_SERVICE_SDEVS_FID);
279  M0_UT_ASSERT(rc == 0);
280 
281  while ((rc = m0_conf_diter_next_sync(&it, filter ?
283  NULL)) == M0_CONF_DIRNEXT)
285 
287  M0_UT_ASSERT(rc == 0);
288 }
289 
290 static void conf_diter_test(const char *confd_addr,
291  struct m0_rpc_machine *rpc_mach,
292  const char *local_conf)
293 {
294  struct m0_confc confc;
295  struct m0_conf_obj *root = NULL;
296  int rc;
297 
298  M0_SET0(&confc);
300  local_conf);
301  M0_UT_ASSERT(rc == 0);
303  M0_UT_ASSERT(rc == 0);
304 
307  all_fs_to_sdevs_check(&confc, root, false);
310 
312 }
313 
314 static void test_diter_local(void)
315 {
316  char *confstr = NULL;
317  int rc;
318 
319  rc = m0_file_read(M0_UT_PATH("diter.xc"), &confstr);
320  M0_UT_ASSERT(rc == 0);
321  conf_diter_test(NULL, NULL, confstr);
322  m0_free(confstr);
323 }
324 
325 static void test_diter_net(void)
326 {
327  struct m0_rpc_machine mach;
328  int rc;
329 #define NAME(ext) "utconfd" ext
330  char *argv[] = {
331  NAME(""), "-T", "AD", "-D", NAME(".db"),
332  "-S", NAME(".stob"), "-A", "linuxstob:"NAME("-addb.stob"),
333  "-w", "10", "-e", SERVER_ENDPOINT, "-H", SERVER_ENDPOINT_ADDR,
334  "-f", M0_UT_CONF_PROCESS,
335  "-c", M0_UT_PATH("diter.xc")
336  };
337  struct m0_rpc_server_ctx confd = {
339  .rsx_xprts_nr = m0_net_xprt_nr(),
340  .rsx_argv = argv,
341  .rsx_argc = ARRAY_SIZE(argv),
342  .rsx_log_file_name = NAME(".log")
343  };
344 #undef NAME
345 
346  M0_SET0(&mach);
347  rc = m0_rpc_server_start(&confd);
348  M0_UT_ASSERT(rc == 0);
349 
352  M0_UT_ASSERT(rc == 0);
353 
355 
357  m0_rpc_server_stop(&confd);
358 }
359 
360 static void test_diter_invalid_input(void)
361 {
362  struct m0_confc confc;
363  struct m0_conf_diter it;
364  struct m0_conf_obj *root;
365  char *confstr = NULL;
366  int rc;
367 
368  rc = m0_file_read(M0_UT_PATH("diter.xc"), &confstr);
369  M0_UT_ASSERT(rc == 0);
370  rc = m0_confc_init(&confc, &m0_conf_ut_grp, NULL, NULL, confstr);
371  M0_UT_ASSERT(rc == 0);
372  m0_free0(&confstr);
374  M0_UT_ASSERT(rc == 0);
375 
377  M0_CONF_NODE_PROCESSES_FID,
378  M0_CONF_PROCESS_SERVICES_FID,
379  M0_CONF_SERVICE_SDEVS_FID);
380  M0_UT_ASSERT(rc == 0);
381 
384 
385  M0_UT_ASSERT(rc == -ENOENT);
389 }
390 
391 /* ------------------------------------------------------------------ */
393  .ts_name = "conf-diter-ut",
394  .ts_init = m0_conf_ut_ast_thread_init,
395  .ts_fini = m0_conf_ut_ast_thread_fini,
396  .ts_tests = {
397  { "local", test_diter_local },
398  { "net", test_diter_net },
399  { "invalid input", test_diter_invalid_input },
400  { NULL, NULL }
401  }
402 };
403 
404 #undef M0_TRACE_SUBSYSTEM
const struct m0_conf_obj_type * m0_conf_obj_type(const struct m0_conf_obj *obj)
Definition: obj.c:363
static bool _filter_service(const struct m0_conf_obj *obj)
Definition: diter.c:263
Definition: diter.c:48
struct m0_conf_obj * cc_root
Definition: confc.h:404
const struct m0_conf_obj_type M0_CONF_OBJV_TYPE
Definition: objv.c:151
Definition: diter.c:65
static void test_diter_net(void)
Definition: diter.c:325
#define NULL
Definition: misc.h:38
static void test_diter_local(void)
Definition: diter.c:314
Definition: diter.c:61
M0_INTERNAL int m0_file_read(const char *path, char **out)
Definition: fs.c:61
const struct m0_conf_obj_type M0_CONF_PVER_TYPE
Definition: pver.c:260
const struct m0_conf_obj_type M0_CONF_SERVICE_TYPE
Definition: service.c:156
int m0_rpc_server_start(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:50
static struct net_test_cmd_node * node
Definition: commands.c:72
Definition: diter.c:68
static void all_fs_to_disks_check(struct m0_confc *confc, struct m0_conf_obj *root)
Definition: diter.c:243
static void test_diter_invalid_input(void)
Definition: diter.c:360
M0_INTERNAL int m0_ut_rpc_machine_start(struct m0_rpc_machine *mach, struct m0_net_xprt *xprt, const char *ep_addr)
Definition: rpc_helpers.c:46
M0_INTERNAL int m0_confc_init(struct m0_confc *confc, struct m0_sm_group *sm_group, const char *confd_addr, struct m0_rpc_machine *rpc_mach, const char *local_conf)
Definition: confc.c:560
const struct m0_conf_obj_type M0_CONF_SDEV_TYPE
Definition: sdev.c:122
M0_INTERNAL int m0_conf_diter_next_sync(struct m0_conf_diter *it, bool(*filter)(const struct m0_conf_obj *obj))
Definition: diter.c:555
Definition: diter.c:41
static struct m0_be_emap_cursor it
Definition: extmap.c:46
M0_INTERNAL void m0_confc_fini(struct m0_confc *confc)
Definition: confc.c:570
static void all_fs_to_sdevs_check(struct m0_confc *confc, struct m0_conf_obj *root, bool filter)
Definition: diter.c:268
static struct m0_addb2_mach * mach
Definition: storage.c:42
#define m0_exists(var, nr,...)
Definition: misc.h:134
Definition: diter.c:60
Definition: diter.c:47
Definition: diter.c:54
#define M0_SET0(obj)
Definition: misc.h:64
#define CLIENT_ENDPOINT_ADDR
Definition: common.h:32
Definition: ut.h:77
Definition: diter.c:37
static struct foo * obj
Definition: tlist.c:302
const struct m0_conf_obj_type M0_CONF_CONTROLLER_TYPE
Definition: controller.c:131
static void check_objv(const struct m0_conf_obj *obj)
Definition: diter.c:143
struct m0_fid fid
Definition: di.c:46
Definition: filter.py:1
int i
Definition: dir.c:1033
Definition: diter.c:72
struct m0_conf_root * root
Definition: note.c:50
Definition: diter.c:50
Definition: diter.c:38
#define M0_FID_TINIT(type, container, key)
Definition: fid.h:90
const struct m0_conf_obj_type M0_CONF_ENCLOSURE_TYPE
Definition: enclosure.c:140
M0_INTERNAL int m0_conf_ut_ast_thread_fini(void)
Definition: common.c:96
#define m0_free0(pptr)
Definition: memory.h:77
Definition: diter.c:59
#define M0_ASSERT(cond)
static struct m0_confc * confc
Definition: file.c:94
Definition: diter.c:52
struct m0_conf_obj * m0_conf_obj_grandparent(const struct m0_conf_obj *obj)
Definition: obj.c:384
static struct m0_thread t[8]
Definition: service_ut.c:1230
Definition: diter.c:64
struct m0_ut_suite conf_diter_ut
Definition: diter.c:392
int m0_net_xprt_nr(void)
Definition: net.c:168
static char local_conf[]
Definition: file.c:115
Definition: diter.c:69
const char * confd_addr[]
struct m0_net_xprt * m0_net_xprt_default_get(void)
Definition: net.c:151
struct m0_net_xprt ** rsx_xprts
Definition: rpclib.h:69
Definition: diter.c:51
Definition: diter.c:62
#define SERVER_ENDPOINT
Definition: common.h:31
const struct m0_conf_obj_type M0_CONF_DRIVE_TYPE
Definition: drive.c:108
static void conf_diter_test(const char *confd_addr, struct m0_rpc_machine *rpc_mach, const char *local_conf)
Definition: diter.c:290
Definition: diter.c:45
struct m0_sm_group m0_conf_ut_grp
Definition: common.c:32
static const struct m0_fid fids[]
Definition: diter.c:76
#define M0_CONF_CAST(ptr, type)
Definition: obj.h:780
struct m0_conf_sdev * ck_sdev
Definition: obj.h:710
Definition: diter.c:49
#define m0_confc_open_sync(result, origin,...)
Definition: confc.h:707
M0_INTERNAL int m0_conf_ut_ast_thread_init(void)
Definition: common.c:86
static bool _filter_diskv(const struct m0_conf_obj *obj)
Definition: diter.c:198
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
M0_INTERNAL struct m0_conf_obj * m0_conf_diter_result(const struct m0_conf_diter *it)
Definition: diter.c:576
#define m0_conf_diter_init(iter, confc, origin,...)
Definition: diter.h:235
const char * ts_name
Definition: ut.h:99
Definition: diter.c:43
#define NAME(ext)
Definition: diter.c:58
Definition: fid.h:38
const struct m0_conf_obj_type M0_CONF_NODE_TYPE
Definition: node.c:128
Definition: diter.c:53
#define M0_UT_CONF_PROCESS
Definition: misc.h:45
static int r[NR]
Definition: thread.c:46
Definition: diter.c:40
struct m0_net_xprt ** m0_net_all_xprt_get(void)
Definition: net.c:161
M0_INTERNAL void m0_conf_diter_fini(struct m0_conf_diter *it)
Definition: diter.c:313
static void check_obj(const struct m0_conf_obj *obj)
Definition: diter.c:158
struct m0_conf_obj sd_obj
Definition: obj.h:616
Definition: diter.c:44
static void verify_node(const struct m0_conf_obj *obj)
Definition: diter.c:122
M0_INTERNAL void m0_confc_close(struct m0_conf_obj *obj)
Definition: confc.c:921
M0_INTERNAL void m0_ut_rpc_machine_stop(struct m0_rpc_machine *mach)
Definition: rpc_helpers.c:93
Definition: diter.c:55
Definition: diter.c:39
void m0_rpc_server_stop(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:85
#define SERVER_ENDPOINT_ADDR
Definition: common.h:30
Definition: diter.c:70
static void verify_obj(const struct m0_conf_obj *obj, const struct m0_fid *fid)
Definition: diter.c:116
const struct m0_conf_obj_type M0_CONF_PROCESS_TYPE
Definition: process.c:161
#define M0_UT_PATH(name)
Definition: misc.h:41
static void all_fs_to_diskv_check(struct m0_confc *confc, struct m0_conf_obj *root)
Definition: diter.c:206
Definition: diter.c:42
#define M0_FID0
Definition: fid.h:93
Definition: diter.c:46
void m0_free(void *data)
Definition: memory.c:146
static struct m0_addb2_source * s
Definition: consumer.c:39
int32_t rc
Definition: trigger_fop.h:47
static void verify_disk(const struct m0_conf_obj *obj)
Definition: diter.c:133
#define ARRAY_SIZE(a)
Definition: misc.h:45
#define M0_UT_ASSERT(a)
Definition: ut.h:46
const struct m0_conf_obj_type M0_CONF_RACK_TYPE
Definition: rack.c:124
struct m0_conf_obj ck_obj
Definition: obj.h:707
struct m0_conf_obj * cv_real
Definition: obj.h:558
Definition: diter.c:63
Definition: diter.c:71