Skip to content

Commit 2e80fb1

Browse files
committed
Container: T7473: Fix show/monitor container log failure and allow log-driver to be configured per container
1 parent 5dd5e74 commit 2e80fb1

File tree

6 files changed

+72
-34
lines changed

6 files changed

+72
-34
lines changed

data/templates/container/containers.conf.j2

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,7 @@ default_sysctls = [
172172

173173
# Logging driver for the container. Available options: k8s-file and journald.
174174
#
175-
{% if log_driver is vyos_defined %}
176-
log_driver = "{{ log_driver }}"
177-
{% else %}
178175
#log_driver = "k8s-file"
179-
{% endif %}
180176

181177
# Maximum size allowed for the container log file. Negative numbers indicate
182178
# that no size limit is imposed. If positive, it must be >= 8192 to match or

interface-definitions/container.xml.in

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,30 @@
532532
</leafNode>
533533
</children>
534534
</tagNode>
535+
<leafNode name="log-driver">
536+
<properties>
537+
<help>Configure container log driver</help>
538+
<completionHelp>
539+
<list>k8s-file journald none</list> <!-- Added none -->
540+
</completionHelp>
541+
<valueHelp>
542+
<format>k8s-file</format>
543+
<description>Logs to plain-text file</description>
544+
</valueHelp>
545+
<valueHelp>
546+
<format>journald</format>
547+
<description>Logs to systemd's journal</description>
548+
</valueHelp>
549+
<valueHelp>
550+
<format>none</format>
551+
<description>Disable logging for the container</description>
552+
</valueHelp>
553+
<constraint>
554+
<regex>(k8s-file|journald|none)</regex>
555+
</constraint>
556+
</properties>
557+
<defaultValue>k8s-file</defaultValue>
558+
</leafNode>
535559
</children>
536560
</tagNode>
537561
<tagNode name="network">
@@ -627,25 +651,6 @@
627651
</node>
628652
</children>
629653
</tagNode>
630-
<leafNode name="log-driver">
631-
<properties>
632-
<help>Configure container log driver</help>
633-
<completionHelp>
634-
<list>k8s-file journald</list>
635-
</completionHelp>
636-
<valueHelp>
637-
<format>k8s-file</format>
638-
<description>Logs to plain-text json file</description>
639-
</valueHelp>
640-
<valueHelp>
641-
<format>journald</format>
642-
<description>Logs to systemd's journal</description>
643-
</valueHelp>
644-
<constraint>
645-
<regex>(k8s-file|journald)</regex>
646-
</constraint>
647-
</properties>
648-
</leafNode>
649654
</children>
650655
</node>
651656
</interfaceDefinition>

op-mode-definitions/container.xml.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<path>container name</path>
9090
</completionHelp>
9191
</properties>
92-
<command>sudo podman logs --follow --names "$4"</command>
92+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --follow --name "$4"</command>
9393
</tagNode>
9494
</children>
9595
</node>
@@ -133,7 +133,7 @@
133133
</completionHelp>
134134
</properties>
135135
<!-- no admin check -->
136-
<command>sudo podman logs --names "$4"</command>
136+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --name "$4"</command>
137137
</tagNode>
138138
<node name="network">
139139
<properties>
@@ -162,7 +162,7 @@
162162
<path>container name</path>
163163
</completionHelp>
164164
</properties>
165-
<command>sudo podman logs --names "$4"</command>
165+
<command>sudo ${vyos_op_scripts_dir}/container.py show_log --name "$4"</command>
166166
</tagNode>
167167
</children>
168168
</node>

smoketest/scripts/cli/test_container.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def test_basic(self):
9595
'4096',
9696
]
9797
)
98-
98+
self.cli_set(base_path + ['name', cont_name, 'log-driver', 'journald'])
9999
# commit changes
100100
self.cli_commit()
101101

@@ -110,14 +110,10 @@ def test_basic(self):
110110
tmp = cmd(f'sudo podman exec -it {cont_name} sysctl kernel.msgmax')
111111
self.assertEqual(tmp, 'kernel.msgmax = 4096')
112112

113-
def test_log_driver(self):
114-
self.cli_set(base_path + ['log-driver', 'journald'])
115-
116-
self.cli_commit()
117-
118-
tmp = cmd('podman info --format "{{ .Host.LogDriver }}"')
113+
tmp = cmd(f'podman container inspect {cont_name} --format "{{{{ .HostConfig.LogConfig.Type }}}}""')
119114
self.assertEqual(tmp, 'journald')
120115

116+
121117
def test_name_server(self):
122118
cont_name = 'dns-test'
123119
net_name = 'net-test'

src/conf_mode/container.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ def generate_run_arguments(name, container_config):
310310
memory = container_config['memory']
311311
shared_memory = container_config['shared_memory']
312312
restart = container_config['restart']
313+
log_driver = container_config['log_driver']
313314

314315
# Add sysctl options
315316
sysctl_opt = ''
@@ -408,7 +409,7 @@ def generate_run_arguments(name, container_config):
408409
name_server += f'--dns {ns}'
409410

410411
container_base_cmd = f'--detach --interactive --tty --replace {capabilities} {privileged} --cpus {cpu_quota} {sysctl_opt} ' \
411-
f'--memory {memory}m --shm-size {shared_memory}m --memory-swap 0 --restart {restart} ' \
412+
f'--memory {memory}m --shm-size {shared_memory}m --memory-swap 0 --restart {restart} --log-driver={log_driver} ' \
412413
f'--name {name} {hostname} {device} {port} {name_server} {volume} {tmpfs} {env_opt} {label} {uid} {host_pid}'
413414

414415
entrypoint = ''

src/op_mode/container.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import json
1818
import sys
19+
import subprocess
1920

2021
from vyos.utils.process import cmd
2122
from vyos.utils.process import rc_cmd
@@ -109,6 +110,45 @@ def restart(name: str):
109110
print(f'Container "{name}" restarted!')
110111
return output
111112

113+
def show_log(name: str, follow: bool = False, raw: bool = False):
114+
"""
115+
Show or monitor logs for a specific container.
116+
Use --follow to continuously stream logs.
117+
"""
118+
from vyos.configquery import ConfigTreeQuery
119+
conf = ConfigTreeQuery()
120+
container = conf.get_config_dict(['container', 'name', name], get_first_key=True, with_recursive_defaults=True)
121+
log_type = container.get('log-driver')
122+
if log_type == 'k8s-file':
123+
if follow:
124+
log_command_list = ['sudo', 'podman', 'logs', '--follow', '--names', name]
125+
else:
126+
log_command_list = ['sudo', 'podman', 'logs', '--names', name]
127+
if log_type == 'journald':
128+
if follow:
129+
log_command_list = ['journalctl', '--follow', '--unit', f'vyos-container-{name}.service']
130+
else:
131+
log_command_list = ['journalctl', '-e', '--no-pager', '--unit', f'vyos-container-{name}.service']
132+
if log_type == 'none':
133+
print(f'Container "{name}" has disabled logs.')
134+
return None
135+
136+
process = None
137+
try:
138+
process = subprocess.Popen(log_command_list,
139+
stdout=sys.stdout,
140+
stderr=sys.stderr)
141+
process.wait()
142+
except KeyboardInterrupt:
143+
if process:
144+
process.terminate()
145+
process.wait()
146+
return None
147+
except Exception as e:
148+
raise vyos.opmode.InternalError(f"Error starting logging command: {e} ")
149+
return None
150+
151+
112152
if __name__ == '__main__':
113153
try:
114154
res = vyos.opmode.run(sys.modules[__name__])

0 commit comments

Comments
 (0)