summaryrefslogtreecommitdiff
path: root/0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch
diff options
context:
space:
mode:
Diffstat (limited to '0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch')
-rw-r--r--0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch227
1 files changed, 227 insertions, 0 deletions
diff --git a/0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch b/0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch
new file mode 100644
index 0000000..1fee14a
--- /dev/null
+++ b/0148-fix-issues-Isula-ps-cannot-display-port-mapping.patch
@@ -0,0 +1,227 @@
+From 6d5121eacdb42a4dd7c2ea498c534b893b80e405 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=E6=AD=A6=E7=A7=AF=E8=B6=85?= <wujichao1@huawei.com>
+Date: Thu, 7 Nov 2024 20:17:41 +0800
+Subject: [PATCH 148/156] fix issues: Isula ps cannot display port mapping
+
+---
+ src/api/services/containers/container.proto | 1 +
+ .../connect/grpc/grpc_containers_client.cc | 2 +
+ src/client/connect/protocol_type.c | 4 ++
+ src/client/connect/protocol_type.h | 1 +
+ src/cmd/isula/information/ps.c | 9 ++-
+ .../connect/grpc/container/list_service.cc | 3 +
+ src/daemon/executor/container_cb/list.c | 2 +
+ src/daemon/modules/api/container_api.h | 2 +
+ src/daemon/modules/container/container_unix.c | 56 ++++++++++++++++++-
+ 9 files changed, 77 insertions(+), 3 deletions(-)
+
+diff --git a/src/api/services/containers/container.proto b/src/api/services/containers/container.proto
+index 8d05681e..113fcb10 100644
+--- a/src/api/services/containers/container.proto
++++ b/src/api/services/containers/container.proto
+@@ -65,6 +65,7 @@ message Container {
+ string name = 16;
+ string health_state = 17;
+ int64 created = 18;
++ string ports = 19;
+ }
+
+ message Container_info {
+diff --git a/src/client/connect/grpc/grpc_containers_client.cc b/src/client/connect/grpc/grpc_containers_client.cc
+index adeac0ba..f042290e 100644
+--- a/src/client/connect/grpc/grpc_containers_client.cc
++++ b/src/client/connect/grpc/grpc_containers_client.cc
+@@ -1241,6 +1241,8 @@ private:
+ util_strdup_s("none");
+ response->container_summary[index]->command = !in.command().empty() ? util_strdup_s(in.command().c_str()) :
+ util_strdup_s("-");
++ response->container_summary[index]->ports = !in.ports().empty() ? util_strdup_s(in.ports().c_str()) :
++ nullptr;
+ const char *starttime = !in.startat().empty() ? in.startat().c_str() : "-";
+ response->container_summary[index]->startat = util_strdup_s(starttime);
+
+diff --git a/src/client/connect/protocol_type.c b/src/client/connect/protocol_type.c
+index 57dcf753..d0ab9732 100644
+--- a/src/client/connect/protocol_type.c
++++ b/src/client/connect/protocol_type.c
+@@ -531,6 +531,10 @@ void isula_list_response_free(struct isula_list_response *response)
+ free(response->container_summary[i]->command);
+ response->container_summary[i]->command = NULL;
+ }
++ if (response->container_summary[i]->ports != NULL) {
++ free(response->container_summary[i]->ports);
++ response->container_summary[i]->ports = NULL;
++ }
+ if (response->container_summary[i]->startat != NULL) {
+ free(response->container_summary[i]->startat);
+ response->container_summary[i]->startat = NULL;
+diff --git a/src/client/connect/protocol_type.h b/src/client/connect/protocol_type.h
+index 2b445c5a..02e315bf 100644
+--- a/src/client/connect/protocol_type.h
++++ b/src/client/connect/protocol_type.h
+@@ -204,6 +204,7 @@ struct isula_container_summary_info {
+ char *id;
+ char *image;
+ char *command;
++ char *ports;
+ char *name;
+ Container_Status status;
+ uint32_t exit_code;
+diff --git a/src/cmd/isula/information/ps.c b/src/cmd/isula/information/ps.c
+index 13c35dc7..6bdc157f 100644
+--- a/src/cmd/isula/information/ps.c
++++ b/src/cmd/isula/information/ps.c
+@@ -332,7 +332,8 @@ static void print_basic_container_info_item(const struct isula_container_summary
+ } else if (strcmp(name, "Created") == 0) {
+ print_created_field(in->created, length->created_length);
+ } else if (strcmp(name, "Ports") == 0) {
+- printf("%-*s", (int)length->ports_length, " ");
++ const char *ports = (in->ports != NULL ? in->ports : "N/A");
++ printf("%-*s", (int)length->ports_length, ports);
+ }
+ }
+
+@@ -515,6 +516,12 @@ static void list_field_width(struct isula_container_summary_info **info, const s
+ l->command_length = (unsigned int)cmd_len;
+ }
+ }
++ if (in->ports != NULL) {
++ size_t ports_len = strlen(in->ports);
++ if (ports_len > l->ports_length) {
++ l->ports_length = (unsigned int)ports_len;
++ }
++ }
+
+ calculate_str_length(in->name, &l->name_length);
+ calculate_str_length(in->runtime, &l->runtime_length);
+diff --git a/src/daemon/entry/connect/grpc/container/list_service.cc b/src/daemon/entry/connect/grpc/container/list_service.cc
+index e831acbc..dfd48191 100644
+--- a/src/daemon/entry/connect/grpc/container/list_service.cc
++++ b/src/daemon/entry/connect/grpc/container/list_service.cc
+@@ -121,6 +121,9 @@ void ContainerListService::FillResponseTogRPC(void *containerRes, containers::Li
+ if (response->containers[i]->command != nullptr) {
+ container->set_command(response->containers[i]->command);
+ }
++ if (response->containers[i]->ports != nullptr) {
++ container->set_ports(response->containers[i]->ports);
++ }
+ container->set_exit_code(response->containers[i]->exit_code);
+ container->set_restartcount(response->containers[i]->restartcount);
+ if (response->containers[i]->startat != nullptr) {
+diff --git a/src/daemon/executor/container_cb/list.c b/src/daemon/executor/container_cb/list.c
+index 243eb4d2..2e8c7a79 100644
+--- a/src/daemon/executor/container_cb/list.c
++++ b/src/daemon/executor/container_cb/list.c
+@@ -609,6 +609,8 @@ static int fill_container_info(container_container *container_info, const contai
+
+ container_info->status = (int)container_state_judge_status(cont_state);
+
++ container_info->ports = container_get_ports(cont);
++
+ container_info->command = container_get_command(cont);
+ image = container_get_image(cont);
+ container_info->image = image ? image : util_strdup_s("none");
+diff --git a/src/daemon/modules/api/container_api.h b/src/daemon/modules/api/container_api.h
+index a6ec8e22..e4d7fc25 100644
+--- a/src/daemon/modules/api/container_api.h
++++ b/src/daemon/modules/api/container_api.h
+@@ -185,6 +185,8 @@ int container_v2_spec_merge_container_spec(container_config_v2_common_config *v2
+
+ char *container_get_command(const container_t *cont);
+
++char *container_get_ports(const container_t *cont);
++
+ char *container_get_image(const container_t *cont);
+
+ int container_exit_on_next(container_t *cont);
+diff --git a/src/daemon/modules/container/container_unix.c b/src/daemon/modules/container/container_unix.c
+index 6f345ea0..812ab9e1 100644
+--- a/src/daemon/modules/container/container_unix.c
++++ b/src/daemon/modules/container/container_unix.c
+@@ -20,6 +20,7 @@
+ #include <isula_libutils/container_config_v2.h>
+ #include <isula_libutils/host_config.h>
+ #include <isula_libutils/json_common.h>
++#include <isula_libutils/auto_cleanup.h>
+ #include <limits.h>
+ #include <pthread.h>
+ #include <stdbool.h>
+@@ -1253,7 +1254,7 @@ char *container_get_command(const container_t *cont)
+ if (cont->common_config->path != NULL) {
+ nret = util_array_append(&args, cont->common_config->path);
+ if (nret < 0) {
+- ERROR("Appned string failed");
++ ERROR("Append string failed");
+ goto cleanup;
+ }
+ }
+@@ -1268,7 +1269,7 @@ char *container_get_command(const container_t *cont)
+ nret = util_array_append(&args, arg);
+ free(arg);
+ if (nret < 0) {
+- ERROR("Appned string failed");
++ ERROR("Append string failed");
+ goto cleanup;
+ }
+ }
+@@ -1280,6 +1281,57 @@ cleanup:
+ return cmd;
+ }
+
++/* container get ports */
++char *container_get_ports(const container_t *cont)
++{
++ int nret;
++ size_t i, j, ports_num = 0;
++ __isula_auto_array_t char **args = NULL;
++ char *ports = NULL;
++
++ if (cont == NULL || cont->hostconfig == NULL || cont->hostconfig->port_bindings == NULL) {
++ return NULL;
++ }
++
++ for (i = 0; cont->hostconfig->port_bindings->keys != NULL && i < cont->hostconfig->port_bindings->len; i++) {
++ for (j = 0; j < cont->hostconfig->port_bindings->values[i]->element->host_len; j++) {
++ __isula_auto_free char *arg = NULL;
++ char *host_ip = cont->hostconfig->port_bindings->values[i]->element->host[j]->host_ip;
++ if (host_ip == NULL) {
++ host_ip = "0.0.0.0";
++ }
++ char *host_port = cont->hostconfig->port_bindings->values[i]->element->host[j]->host_port;
++ if (host_port == NULL) {
++ host_port = "";
++ }
++ char *cont_port_type = cont->hostconfig->port_bindings->keys[i];
++ if (cont_port_type == NULL) {
++ cont_port_type = "";
++ }
++ size_t total_len = strlen(host_ip) + strlen(host_port) + strlen(cont_port_type) + 4; // 4 for ":->" and null terminator
++ arg = util_common_calloc_s(total_len);
++ if (arg == NULL) {
++ ERROR("Out of memory");
++ return ports;
++ }
++ nret = snprintf(arg, total_len, "%s:%s->%s", host_ip, host_port, cont_port_type);
++ if (nret < 0 || (size_t)nret >= total_len) {
++ ERROR("Failed to print string");
++ return ports;
++ }
++ nret = util_array_append(&args, arg);
++ if (nret < 0) {
++ ERROR("Append string failed");
++ return ports;
++ }
++ ports_num++;
++ }
++ }
++ ports = util_string_join(", ", (const char **)args, ports_num);
++
++ return ports;
++}
++
+ /* container get image */
+ char *container_get_image(const container_t *cont)
+ {
+--
+2.34.1
+