Skip to content

Commit 2a6abd6

Browse files
committed
PE: Containers: Allow the internal and external ports to optionally differ
1 parent 12e12ae commit 2a6abd6

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

lib/pengine/container.c

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,13 @@ create_docker_resource(
232232
}
233233

234234
for(GListPtr pIter = data->ports; pIter != NULL; pIter = pIter->next) {
235-
char *port = pIter->data;
235+
container_port_t *port = pIter->data;
236236

237237
if(tuple->ipaddr) {
238238
offset += snprintf(buffer+offset, max-offset, " -p %s:%s:%s",
239-
tuple->ipaddr, port, port);
239+
tuple->ipaddr, port->source, port->target);
240240
} else {
241-
offset += snprintf(buffer+offset, max-offset, " -p %s:%s", port, port);
241+
offset += snprintf(buffer+offset, max-offset, " -p %s:%s", port->source, port->target);
242242
}
243243
}
244244

@@ -410,6 +410,13 @@ static void mount_free(container_mount_t *mount)
410410
free(mount);
411411
}
412412

413+
static void port_free(container_port_t *port)
414+
{
415+
free(port->source);
416+
free(port->target);
417+
free(port);
418+
}
419+
413420
gboolean
414421
container_unpack(resource_t * rsc, pe_working_set_t * data_set)
415422
{
@@ -465,16 +472,24 @@ container_unpack(resource_t * rsc, pe_working_set_t * data_set)
465472
for (xmlNode *xml_child = __xml_first_child_element(xml_obj); xml_child != NULL;
466473
xml_child = __xml_next_element(xml_child)) {
467474

468-
char *port = crm_element_value_copy(xml_child, "port");
475+
container_port_t *port = calloc(1, sizeof(container_port_t));
476+
port->source = crm_element_value_copy(xml_child, "port");
469477

470-
if(port == NULL) {
471-
port = crm_element_value_copy(xml_child, "range");
478+
if(port->source == NULL) {
479+
port->source = crm_element_value_copy(xml_child, "range");
480+
} else {
481+
port->target = crm_element_value_copy(xml_child, "internal-port");
472482
}
473483

474-
if(port != NULL) {
484+
if(port->source != NULL && strlen(port->source) > 0) {
485+
if(port->target == NULL) {
486+
port->target = strdup(port->source);
487+
}
475488
container_data->ports = g_list_append(container_data->ports, port);
489+
476490
} else {
477491
pe_err("Invalid port directive %s", ID(xml_child));
492+
port_free(port);
478493
}
479494
}
480495
}
@@ -557,6 +572,7 @@ container_unpack(resource_t * rsc, pe_working_set_t * data_set)
557572
GListPtr childIter = NULL;
558573
resource_t *new_rsc = NULL;
559574
container_mount_t *mount = NULL;
575+
container_port_t *port = calloc(1, sizeof(container_port_t));
560576

561577
int offset = 0, max = 1024;
562578
char *buffer = calloc(1, max+1);
@@ -576,11 +592,14 @@ container_unpack(resource_t * rsc, pe_working_set_t * data_set)
576592
container_data->mounts = g_list_append(container_data->mounts, mount);
577593

578594
if(container_data->control_port) {
579-
container_data->ports = g_list_append(container_data->ports, strdup(container_data->control_port));
595+
port->source = strdup(container_data->control_port);
580596
} else {
581-
container_data->ports = g_list_append(container_data->ports, crm_itoa(DEFAULT_REMOTE_PORT));
597+
port->source = crm_itoa(DEFAULT_REMOTE_PORT);
582598
}
583599

600+
port->target = strdup(port->source);
601+
container_data->ports = g_list_append(container_data->ports, port);
602+
584603
if (common_unpack(xml_resource, &new_rsc, rsc, data_set) == FALSE) {
585604
pe_err("Failed unpacking resource %s", crm_element_value(rsc->xml, XML_ATTR_ID));
586605
if (new_rsc != NULL && new_rsc->fns != NULL) {
@@ -845,7 +864,7 @@ container_free(resource_t * rsc)
845864

846865
g_list_free_full(container_data->tuples, (GDestroyNotify)tuple_free);
847866
g_list_free_full(container_data->mounts, (GDestroyNotify)mount_free);
848-
g_list_free_full(container_data->ports, free);
867+
g_list_free_full(container_data->ports, (GDestroyNotify)port_free);
849868
common_free(rsc);
850869
}
851870

lib/pengine/variant.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ typedef struct
7878

7979
} container_mount_t;
8080

81+
typedef struct
82+
{
83+
char *source;
84+
char *target;
85+
86+
} container_port_t;
87+
8188
typedef struct container_variant_data_s {
8289
int masters;
8390
int replicas;

xml/resources-2.8.rng

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,12 @@
115115
<element name="port-mapping">
116116
<attribute name="id"><data type="ID"/></attribute>
117117
<choice>
118-
<attribute name="port"><data type="integer"/></attribute>
118+
<group>
119+
<attribute name="port"><data type="integer"/></attribute>
120+
<optional>
121+
<attribute name="internal-port"><data type="integer"/></attribute>
122+
</optional>
123+
</group>
119124
<attribute name="range">
120125
<data type="string">
121126
<param name="pattern">([0-9\-]+)</param>

0 commit comments

Comments
 (0)