Line data Source code
1 : /*
2 : * Copyright 2023 the Pacemaker project contributors
3 : *
4 : * The version control history for this file may have further details.
5 : *
6 : * This source code is licensed under the GNU Lesser General Public License
7 : * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 : */
9 :
10 : #include <crm_internal.h>
11 :
12 : #include <crm/lrmd_internal.h>
13 : #include <pacemaker.h>
14 : #include <pacemaker-internal.h>
15 :
16 : int
17 0 : pcmk__list_alternatives(pcmk__output_t *out, const char *agent_spec)
18 : {
19 0 : int rc = pcmk_rc_ok;
20 0 : lrmd_t *lrmd_conn = NULL;
21 0 : lrmd_list_t *list = NULL;
22 :
23 0 : CRM_ASSERT(out != NULL && agent_spec != NULL);
24 :
25 0 : rc = lrmd__new(&lrmd_conn, NULL, NULL, 0);
26 0 : if (rc != pcmk_rc_ok) {
27 0 : goto error;
28 : }
29 :
30 0 : rc = lrmd_conn->cmds->list_ocf_providers(lrmd_conn, agent_spec, &list);
31 :
32 0 : if (rc > 0) {
33 0 : rc = out->message(out, "alternatives-list", list, agent_spec);
34 : } else {
35 0 : rc = pcmk_rc_error;
36 : }
37 :
38 0 : error:
39 0 : if (rc != pcmk_rc_ok) {
40 0 : out->err(out, _("No %s found for %s"), "OCF providers", agent_spec);
41 0 : rc = ENXIO;
42 : }
43 :
44 0 : lrmd_api_delete(lrmd_conn);
45 0 : return rc;
46 : }
47 :
48 : // Documented in pacemaker.h
49 : int
50 0 : pcmk_list_alternatives(xmlNodePtr *xml, const char *agent_spec)
51 : {
52 0 : pcmk__output_t *out = NULL;
53 0 : int rc = pcmk_rc_ok;
54 :
55 0 : rc = pcmk__xml_output_new(&out, xml);
56 0 : if (rc != pcmk_rc_ok) {
57 0 : return rc;
58 : }
59 :
60 0 : lrmd__register_messages(out);
61 :
62 0 : rc = pcmk__list_alternatives(out, agent_spec);
63 0 : pcmk__xml_output_finish(out, pcmk_rc2exitc(rc), xml);
64 0 : return rc;
65 : }
66 :
67 : /*!
68 : * \internal
69 : * \brief List all agents available for the named standard and/or provider
70 : *
71 : * \param[in,out] out Output object
72 : * \param[in] agent_spec STD[:PROV]
73 : *
74 : * \return Standard Pacemaker return code
75 : */
76 : int
77 0 : pcmk__list_agents(pcmk__output_t *out, char *agent_spec)
78 : {
79 0 : int rc = pcmk_rc_ok;
80 0 : char *provider = NULL;
81 0 : lrmd_t *lrmd_conn = NULL;
82 0 : lrmd_list_t *list = NULL;
83 :
84 0 : CRM_ASSERT(out != NULL && agent_spec != NULL);
85 :
86 0 : rc = lrmd__new(&lrmd_conn, NULL, NULL, 0);
87 0 : if (rc != pcmk_rc_ok) {
88 0 : goto error;
89 : }
90 :
91 0 : provider = strchr(agent_spec, ':');
92 :
93 0 : if (provider) {
94 0 : *provider++ = 0;
95 : }
96 :
97 0 : rc = lrmd_conn->cmds->list_agents(lrmd_conn, &list, agent_spec, provider);
98 :
99 0 : if (rc > 0) {
100 0 : rc = out->message(out, "agents-list", list, agent_spec, provider);
101 : } else {
102 0 : rc = pcmk_rc_error;
103 : }
104 :
105 0 : error:
106 0 : if (rc != pcmk_rc_ok) {
107 0 : if (provider == NULL) {
108 0 : out->err(out, _("No agents found for standard '%s'"), agent_spec);
109 : } else {
110 0 : out->err(out, _("No agents found for standard '%s' and provider '%s'"),
111 : agent_spec, provider);
112 : }
113 : }
114 :
115 0 : lrmd_api_delete(lrmd_conn);
116 0 : return rc;
117 : }
118 :
119 : // Documented in pacemaker.h
120 : int
121 0 : pcmk_list_agents(xmlNodePtr *xml, char *agent_spec)
122 : {
123 0 : pcmk__output_t *out = NULL;
124 0 : int rc = pcmk_rc_ok;
125 :
126 0 : rc = pcmk__xml_output_new(&out, xml);
127 0 : if (rc != pcmk_rc_ok) {
128 0 : return rc;
129 : }
130 :
131 0 : lrmd__register_messages(out);
132 :
133 0 : rc = pcmk__list_agents(out, agent_spec);
134 0 : pcmk__xml_output_finish(out, pcmk_rc2exitc(rc), xml);
135 0 : return rc;
136 : }
137 :
138 : int
139 0 : pcmk__list_providers(pcmk__output_t *out, const char *agent_spec)
140 : {
141 0 : int rc = pcmk_rc_ok;
142 0 : lrmd_t *lrmd_conn = NULL;
143 0 : lrmd_list_t *list = NULL;
144 :
145 0 : CRM_ASSERT(out != NULL);
146 :
147 0 : rc = lrmd__new(&lrmd_conn, NULL, NULL, 0);
148 0 : if (rc != pcmk_rc_ok) {
149 0 : goto error;
150 : }
151 :
152 0 : rc = lrmd_conn->cmds->list_ocf_providers(lrmd_conn, agent_spec, &list);
153 :
154 0 : if (rc > 0) {
155 0 : rc = out->message(out, "providers-list", list, agent_spec);
156 : } else {
157 0 : rc = pcmk_rc_error;
158 : }
159 :
160 0 : error:
161 0 : if (rc != pcmk_rc_ok) {
162 0 : if (agent_spec == NULL) {
163 0 : out->err(out, _("No %s found"), "OCF providers");
164 : } else {
165 0 : out->err(out, _("No %s found for %s"), "OCF providers", agent_spec);
166 : }
167 :
168 0 : rc = ENXIO;
169 : }
170 :
171 0 : lrmd_api_delete(lrmd_conn);
172 0 : return rc;
173 : }
174 :
175 : // Documented in pacemaker.h
176 : int
177 0 : pcmk_list_providers(xmlNodePtr *xml, const char *agent_spec)
178 : {
179 0 : pcmk__output_t *out = NULL;
180 0 : int rc = pcmk_rc_ok;
181 :
182 0 : rc = pcmk__xml_output_new(&out, xml);
183 0 : if (rc != pcmk_rc_ok) {
184 0 : return rc;
185 : }
186 :
187 0 : lrmd__register_messages(out);
188 :
189 0 : rc = pcmk__list_providers(out, agent_spec);
190 0 : pcmk__xml_output_finish(out, pcmk_rc2exitc(rc), xml);
191 0 : return rc;
192 : }
193 :
194 : int
195 0 : pcmk__list_standards(pcmk__output_t *out)
196 : {
197 0 : int rc = pcmk_rc_ok;
198 0 : lrmd_t *lrmd_conn = NULL;
199 0 : lrmd_list_t *list = NULL;
200 :
201 0 : CRM_ASSERT(out != NULL);
202 :
203 0 : rc = lrmd__new(&lrmd_conn, NULL, NULL, 0);
204 0 : if (rc != pcmk_rc_ok) {
205 0 : goto error;
206 : }
207 :
208 0 : rc = lrmd_conn->cmds->list_standards(lrmd_conn, &list);
209 :
210 0 : if (rc > 0) {
211 0 : rc = out->message(out, "standards-list", list);
212 : } else {
213 0 : rc = pcmk_rc_error;
214 : }
215 :
216 0 : error:
217 0 : if (rc != pcmk_rc_ok) {
218 0 : out->err(out, _("No %s found"), "standards");
219 0 : rc = ENXIO;
220 : }
221 :
222 0 : lrmd_api_delete(lrmd_conn);
223 0 : return rc;
224 : }
225 :
226 : // Documented in pacemaker.h
227 : int
228 0 : pcmk_list_standards(xmlNodePtr *xml)
229 : {
230 0 : pcmk__output_t *out = NULL;
231 0 : int rc = pcmk_rc_ok;
232 :
233 0 : rc = pcmk__xml_output_new(&out, xml);
234 0 : if (rc != pcmk_rc_ok) {
235 0 : return rc;
236 : }
237 :
238 0 : lrmd__register_messages(out);
239 :
240 0 : rc = pcmk__list_standards(out);
241 0 : pcmk__xml_output_finish(out, pcmk_rc2exitc(rc), xml);
242 0 : return rc;
243 : }
|