1 /*
2  * Copyright (c) 2015-2017 Red Hat, Inc.
3  *
4  * All rights reserved.
5  *
6  * Author: Jan Friesse (jfriesse@redhat.com)
7  *
8  * This software licensed under BSD license, the text of which follows:
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * - Redistributions of source code must retain the above copyright notice,
14  *   this list of conditions and the following disclaimer.
15  * - Redistributions in binary form must reproduce the above copyright notice,
16  *   this list of conditions and the following disclaimer in the documentation
17  *   and/or other materials provided with the distribution.
18  * - Neither the name of the Red Hat, Inc. nor the names of its
19  *   contributors may be used to endorse or promote products derived from this
20  *   software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef _QDEVICE_MODEL_H_
36 #define _QDEVICE_MODEL_H_
37 
38 #include "qdevice-cmap.h"
39 #include "qdevice-instance.h"
40 #include "qdevice-model-type.h"
41 #include "qdevice-heuristics-exec-result.h"
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 extern int	qdevice_model_init(struct qdevice_instance *instance);
48 
49 extern int	qdevice_model_destroy(struct qdevice_instance *instance);
50 
51 extern int	qdevice_model_run(struct qdevice_instance *instance);
52 
53 extern int	qdevice_model_get_config_node_list_failed(struct qdevice_instance *instance);
54 
55 extern int	qdevice_model_config_node_list_changed(struct qdevice_instance *instance,
56     const struct node_list *nlist, int config_version_set, uint64_t config_version);
57 
58 extern int	qdevice_model_votequorum_quorum_notify(struct qdevice_instance *instance,
59     uint32_t quorate, uint32_t node_list_entries, votequorum_node_t node_list[]);
60 
61 extern int	qdevice_model_votequorum_node_list_notify(struct qdevice_instance *instance,
62     votequorum_ring_id_t votequorum_ring_id, uint32_t node_list_entries, uint32_t node_list[]);
63 
64 extern int	qdevice_model_votequorum_node_list_heuristics_notify(struct qdevice_instance *instance,
65     votequorum_ring_id_t votequorum_ring_id, uint32_t node_list_entries, uint32_t node_list[],
66     enum qdevice_heuristics_exec_result heuristics_exec_result);
67 
68 extern int 	qdevice_model_votequorum_expected_votes_notify(struct qdevice_instance *instance,
69     uint32_t expected_votes);
70 
71 extern int	qdevice_model_ipc_cmd_status(struct qdevice_instance *instance,
72     struct dynar *outbuf, int verbose);
73 
74 extern int	qdevice_model_cmap_changed(struct qdevice_instance *instance,
75     const struct qdevice_cmap_change_events *events);
76 
77 struct qdevice_model {
78 	const char *name;
79 	int (*init)(struct qdevice_instance *instance);
80 	int (*destroy)(struct qdevice_instance *instance);
81 	int (*run)(struct qdevice_instance *instance);
82 	int (*get_config_node_list_failed)(struct qdevice_instance *instance);
83 	int (*config_node_list_changed)(struct qdevice_instance *instance,
84 	    const struct node_list *nlist, int config_version_set, uint64_t config_version);
85 	int (*votequorum_quorum_notify)(struct qdevice_instance *instance,
86 	    uint32_t quorate, uint32_t node_list_entries, votequorum_node_t node_list[]);
87 	int (*votequorum_node_list_notify)(struct qdevice_instance *instance,
88 	    votequorum_ring_id_t votequorum_ring_id,uint32_t node_list_entries,
89 	    uint32_t node_list[]);
90 	int (*votequorum_node_list_heuristics_notify)(struct qdevice_instance *instance,
91 	    votequorum_ring_id_t votequorum_ring_id,uint32_t node_list_entries,
92 	    uint32_t node_list[], enum qdevice_heuristics_exec_result heuristics_exec_result);
93 	int (*votequorum_expected_votes_notify)(struct qdevice_instance *instance,
94 	    uint32_t expected_votes);
95 	int (*ipc_cmd_status)(struct qdevice_instance *instance, struct dynar *outbuf, int verbose);
96 	int (*cmap_changed)(struct qdevice_instance *instance,
97 	    const struct qdevice_cmap_change_events *events);
98 };
99 
100 extern int		 qdevice_model_register(
101     enum qdevice_model_type model_type, struct qdevice_model *model);
102 
103 extern void qdevice_model_register_all(void);
104 
105 extern int		 qdevice_model_str_to_type(const char *str,
106     enum qdevice_model_type *model_type);
107 
108 extern const char 	*qdevice_model_type_to_str(enum qdevice_model_type model_type);
109 
110 #ifdef __cplusplus
111 }
112 #endif
113 
114 #endif /* _QDEVICE_MODEL_H_ */
115