1 /*
2  * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 #ifndef PE_VARIANT__H
19 #  define PE_VARIANT__H
20 
21 #  if VARIANT_CLONE
22 
23 typedef struct clone_variant_data_s {
24     int clone_max;
25     int clone_node_max;
26 
27     int master_max;
28     int master_node_max;
29 
30     int total_clones;
31     int active_clones;
32     int max_nodes;
33 
34     int masters_active;
35     int masters_allocated;
36 
37     gboolean interleave;
38     gboolean ordered;
39     gboolean applied_master_prefs;
40     gboolean merged_master_weights;
41 
42     notify_data_t *stop_notify;
43     notify_data_t *start_notify;
44     notify_data_t *demote_notify;
45     notify_data_t *promote_notify;
46 
47     xmlNode *xml_obj_child;
48 
49     gboolean notify_confirm;
50 
51 } clone_variant_data_t;
52 
53 #    define get_clone_variant_data(data, rsc)				\
54 	CRM_ASSERT(rsc != NULL);					\
55 	CRM_ASSERT(rsc->variant == pe_clone || rsc->variant == pe_master); \
56 	data = (clone_variant_data_t *)rsc->variant_opaque;
57 
58 #  elif VARIANT_CONTAINER
59 
60 typedef struct
61 {
62         int offset;
63         node_t *node;
64         char *ipaddr;
65         resource_t *ip;
66         resource_t *child;
67         resource_t *docker;
68         resource_t *remote;
69 
70 } container_grouping_t;
71 
72 typedef struct
73 {
74         char *source;
75         char *target;
76         char *options;
77         int flags;
78 
79 } container_mount_t;
80 
81 typedef struct
82 {
83         char *source;
84         char *target;
85 
86 } container_port_t;
87 
88 enum container_type {
89         PE_CONTAINER_TYPE_UNKNOWN,
90         PE_CONTAINER_TYPE_DOCKER,
91         PE_CONTAINER_TYPE_RKT
92 };
93 
94 #define PE_CONTAINER_TYPE_UNKNOWN_S "unknown"
95 #define PE_CONTAINER_TYPE_DOCKER_S  "Docker"
96 #define PE_CONTAINER_TYPE_RKT_S     "rkt"
97 
98 typedef struct container_variant_data_s {
99         int masters;
100         int replicas;
101         int replicas_per_host;
102         char *prefix;
103         char *image;
104         const char *ip_last;
105         char *host_network;
106         char *host_netmask;
107         char *control_port;
108         char *docker_network;
109         char *ip_range_start;
110         char *docker_host_options;
111         char *docker_run_options;
112         char *docker_run_command;
113         const char *attribute_target;
114 
115         resource_t *child;
116 
117         GListPtr tuples;     /* container_grouping_t *       */
118         GListPtr ports;      /*        */
119         GListPtr mounts;     /*        */
120 
121         enum container_type type;
122 } container_variant_data_t;
123 
124 #    define get_container_variant_data(data, rsc)                       \
125 	CRM_ASSERT(rsc != NULL);					\
126 	CRM_ASSERT(rsc->variant == pe_container);                       \
127 	CRM_ASSERT(rsc->variant_opaque != NULL);			\
128 	data = (container_variant_data_t *)rsc->variant_opaque;		\
129 
130 #  elif VARIANT_GROUP
131 
132 typedef struct group_variant_data_s {
133     int num_children;
134     resource_t *first_child;
135     resource_t *last_child;
136 
137     gboolean colocated;
138     gboolean ordered;
139 
140     gboolean child_starting;
141     gboolean child_stopping;
142 
143 } group_variant_data_t;
144 
145 #    define get_group_variant_data(data, rsc)				\
146 	CRM_ASSERT(rsc != NULL);					\
147 	CRM_ASSERT(rsc->variant == pe_group);				\
148 	CRM_ASSERT(rsc->variant_opaque != NULL);			\
149 	data = (group_variant_data_t *)rsc->variant_opaque;		\
150 
151 #  elif VARIANT_NATIVE
152 
153 typedef struct native_variant_data_s {
154     int dummy;
155 } native_variant_data_t;
156 
157 #    define get_native_variant_data(data, rsc)				\
158 	CRM_ASSERT(rsc != NULL);					\
159 	CRM_ASSERT(rsc->variant == pe_native);				\
160 	CRM_ASSERT(rsc->variant_opaque != NULL);			\
161 	data = (native_variant_data_t *)rsc->variant_opaque;
162 
163 #  endif
164 
165 #endif
166