This source file includes following definitions.
- pcmk_get_ra_caps
- pcmk__effective_rc
- crm_generate_ra_key
- crm_parse_agent_spec
- crm_provider_required
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #ifndef _GNU_SOURCE
13 # define _GNU_SOURCE
14 #endif
15
16 #include <stdio.h>
17 #include <string.h>
18 #include <strings.h>
19
20 #include <crm/crm.h>
21 #include <crm/common/util.h>
22
23
24
25
26
27
28
29
30 uint32_t
31 pcmk_get_ra_caps(const char *standard)
32 {
33
34
35
36 if (standard == NULL) {
37 return pcmk_ra_cap_none;
38
39 } else if (!strcasecmp(standard, PCMK_RESOURCE_CLASS_OCF)) {
40 return pcmk_ra_cap_provider | pcmk_ra_cap_params
41 | pcmk_ra_cap_unique | pcmk_ra_cap_promotable;
42
43 } else if (!strcasecmp(standard, PCMK_RESOURCE_CLASS_STONITH)) {
44
45
46
47
48
49
50
51 return pcmk_ra_cap_params | pcmk_ra_cap_unique | pcmk_ra_cap_stdin
52 | pcmk_ra_cap_fence_params;
53
54 } else if (!strcasecmp(standard, PCMK_RESOURCE_CLASS_SYSTEMD)
55 || !strcasecmp(standard, PCMK_RESOURCE_CLASS_SERVICE)
56 || !strcasecmp(standard, PCMK_RESOURCE_CLASS_LSB)
57 || !strcasecmp(standard, PCMK_RESOURCE_CLASS_UPSTART)) {
58
59
60
61
62 return pcmk_ra_cap_status;
63
64 } else if (!strcasecmp(standard, PCMK_RESOURCE_CLASS_NAGIOS)) {
65 return pcmk_ra_cap_params;
66 }
67 return pcmk_ra_cap_none;
68 }
69
70 int
71 pcmk__effective_rc(int rc)
72 {
73 int remapped_rc = rc;
74
75 switch (rc) {
76 case PCMK_OCF_DEGRADED:
77 remapped_rc = PCMK_OCF_OK;
78 break;
79
80 case PCMK_OCF_DEGRADED_MASTER:
81 remapped_rc = PCMK_OCF_RUNNING_MASTER;
82 break;
83
84 default:
85 break;
86 }
87
88 return remapped_rc;
89 }
90
91 char *
92 crm_generate_ra_key(const char *standard, const char *provider,
93 const char *type)
94 {
95 if (!standard && !provider && !type) {
96 return NULL;
97 }
98
99 return crm_strdup_printf("%s%s%s:%s",
100 (standard? standard : ""),
101 (provider? ":" : ""), (provider? provider : ""),
102 (type? type : ""));
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 int
120 crm_parse_agent_spec(const char *spec, char **standard, char **provider,
121 char **type)
122 {
123 char *colon;
124
125 CRM_CHECK(spec && standard && provider && type, return -EINVAL);
126 *standard = NULL;
127 *provider = NULL;
128 *type = NULL;
129
130 colon = strchr(spec, ':');
131 if ((colon == NULL) || (colon == spec)) {
132 return -EINVAL;
133 }
134
135 *standard = strndup(spec, colon - spec);
136 spec = colon + 1;
137
138 if (pcmk_is_set(pcmk_get_ra_caps(*standard), pcmk_ra_cap_provider)) {
139 colon = strchr(spec, ':');
140 if ((colon == NULL) || (colon == spec)) {
141 free(*standard);
142 return -EINVAL;
143 }
144 *provider = strndup(spec, colon - spec);
145 spec = colon + 1;
146 }
147
148 if (*spec == '\0') {
149 free(*standard);
150 free(*provider);
151 return -EINVAL;
152 }
153
154 *type = strdup(spec);
155 return pcmk_ok;
156 }
157
158
159 bool crm_provider_required(const char *standard);
160
161
162
163
164
165
166
167
168
169 bool
170 crm_provider_required(const char *standard)
171 {
172 return pcmk_is_set(pcmk_get_ra_caps(standard), pcmk_ra_cap_provider);
173 }