Skip to content

Commit e484ae9

Browse files
authored
[services] Fix Delay Start of SNMP And Telemetry (#5211)
SNMP and Telemetry services are not critical to switch startup. They also cause fast-reboot not to meet timing requirements. In order to delay start those service are associated with systemd timer units, however when hostcfgd initiate service start, it start the service and not the timer. This PR fixes this issue by starting the timer associated with systemd unit. signed-off-by: Tamer Ahmed <[email protected]>
1 parent da69d57 commit e484ae9

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

files/build_templates/init_cfg.json.j2

+19-17
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,28 @@
1717
{% endfor %}
1818
}
1919
},
20-
{%- set features = [("bgp", "enabled", "enabled"),
21-
("database", "enabled", "disabled"),
22-
("dhcp_relay", "enabled", "enabled"),
23-
("lldp", "enabled", "enabled"),
24-
("pmon", "enabled", "enabled"),
25-
("radv", "enabled", "enabled"),
26-
("snmp", "enabled", "enabled"),
27-
("swss", "enabled", "enabled"),
28-
("syncd", "enabled", "enabled"),
29-
("teamd", "enabled", "enabled")] %}
30-
{%- if include_iccpd == "y" %}{% do features.append(("iccpd", "disabled", "enabled")) %}{% endif %}
31-
{%- if include_mgmt_framework == "y" %}{% do features.append(("mgmt-framework", "enabled", "enabled")) %}{% endif %}
32-
{%- if include_nat == "y" %}{% do features.append(("nat", "disabled", "enabled")) %}{% endif %}
33-
{%- if include_restapi == "y" %}{% do features.append(("restapi", "enabled", "enabled")) %}{% endif %}
34-
{%- if include_sflow == "y" %}{% do features.append(("sflow", "disabled", "enabled")) %}{% endif %}
35-
{%- if include_system_telemetry == "y" %}{% do features.append(("telemetry", "enabled", "enabled")) %}{% endif %}
20+
{%- set features = [("bgp", "enabled", false, "enabled"),
21+
("database", "enabled", false, "disabled"),
22+
("dhcp_relay", "enabled", false, "enabled"),
23+
("lldp", "enabled", false, "enabled"),
24+
("pmon", "enabled", false, "enabled"),
25+
("radv", "enabled", false, "enabled"),
26+
("snmp", "enabled", true, "enabled"),
27+
("swss", "enabled", false, "enabled"),
28+
("syncd", "enabled", false, "enabled"),
29+
("teamd", "enabled", false, "enabled")] %}
30+
{%- if include_iccpd == "y" %}{% do features.append(("iccpd", "disabled", false, "enabled")) %}{% endif %}
31+
{%- if include_mgmt_framework == "y" %}{% do features.append(("mgmt-framework", "enabled", false, "enabled")) %}{% endif %}
32+
{%- if include_nat == "y" %}{% do features.append(("nat", "disabled", false, "enabled")) %}{% endif %}
33+
{%- if include_restapi == "y" %}{% do features.append(("restapi", "enabled", false, "enabled")) %}{% endif %}
34+
{%- if include_sflow == "y" %}{% do features.append(("sflow", "disabled", false, "enabled")) %}{% endif %}
35+
{%- if include_system_telemetry == "y" %}{% do features.append(("telemetry", "enabled", true, "enabled")) %}{% endif %}
3636
"FEATURE": {
37-
{%- for feature, state, autorestart in features %}
37+
{# has_timer field if set, will start the feature systemd .timer unit instead of .service unit #}
38+
{%- for feature, state, has_timer, autorestart in features %}
3839
"{{feature}}": {
3940
"state": "{{state}}",
41+
"has_timer" : {{has_timer | lower()}},
4042
"auto_restart": "{{autorestart}}",
4143
"high_mem_alert": "disabled"
4244
}{% if not loop.last %},{% endif -%}

files/image_config/hostcfgd/hostcfgd

+13-11
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ def obfuscate(data):
4141
return data
4242

4343

44-
def update_feature_state(feature_name, state):
44+
def update_feature_state(feature_name, state, has_timer=False):
45+
feature_suffix = "timer" if has_timer else "service"
4546
if state == "enabled":
4647
start_cmds = []
47-
start_cmds.append("sudo systemctl unmask {}.service".format(feature_name))
48-
start_cmds.append("sudo systemctl enable {}.service".format(feature_name))
49-
start_cmds.append("sudo systemctl start {}.service".format(feature_name))
48+
start_cmds.append("sudo systemctl unmask {}.{}".format(feature_name, feature_suffix))
49+
start_cmds.append("sudo systemctl enable {}.{}".format(feature_name, feature_suffix))
50+
start_cmds.append("sudo systemctl start {}.{}".format(feature_name, feature_suffix))
5051
for cmd in start_cmds:
5152
syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd))
5253
try:
@@ -55,12 +56,12 @@ def update_feature_state(feature_name, state):
5556
syslog.syslog(syslog.LOG_ERR, "'{}' failed. RC: {}, output: {}"
5657
.format(err.cmd, err.returncode, err.output))
5758
continue
58-
syslog.syslog(syslog.LOG_INFO, "Feature '{}' is enabled and started".format(feature_name))
59+
syslog.syslog(syslog.LOG_INFO, "Feature '{}.{}' is enabled and started".format(feature_name, feature_suffix))
5960
elif state == "disabled":
6061
stop_cmds = []
61-
stop_cmds.append("sudo systemctl stop {}.service".format(feature_name))
62-
stop_cmds.append("sudo systemctl disable {}.service".format(feature_name))
63-
stop_cmds.append("sudo systemctl mask {}.service".format(feature_name))
62+
stop_cmds.append("sudo systemctl stop {}.{}".format(feature_name, feature_suffix))
63+
stop_cmds.append("sudo systemctl disable {}.{}".format(feature_name, feature_suffix))
64+
stop_cmds.append("sudo systemctl mask {}.{}".format(feature_name, feature_suffix))
6465
for cmd in stop_cmds:
6566
syslog.syslog(syslog.LOG_INFO, "Running cmd: '{}'".format(cmd))
6667
try:
@@ -71,7 +72,8 @@ def update_feature_state(feature_name, state):
7172
continue
7273
syslog.syslog(syslog.LOG_INFO, "Feature '{}' is stopped and disabled".format(feature_name))
7374
else:
74-
syslog.syslog(syslog.LOG_ERR, "Unexpected state value '{}' for feature '{}'".format(state, feature_name))
75+
syslog.syslog(syslog.LOG_ERR, "Unexpected state value '{}' for feature '{}.{}'"
76+
.format(state, feature_name, feature_suffix))
7577

7678

7779
class Iptables(object):
@@ -284,7 +286,7 @@ class HostConfigDaemon:
284286
syslog.syslog(syslog.LOG_WARNING, "Eanble state of feature '{}' is None".format(feature_name))
285287
continue
286288

287-
update_feature_state(feature_name, state)
289+
update_feature_state(feature_name, state, feature_table[feature_name]['has_timer'])
288290

289291
def aaa_handler(self, key, data):
290292
self.aaacfg.aaa_update(key, data)
@@ -326,7 +328,7 @@ class HostConfigDaemon:
326328
syslog.syslog(syslog.LOG_WARNING, "Enable state of feature '{}' is None".format(feature_name))
327329
return
328330

329-
update_feature_state(feature_name, state)
331+
update_feature_state(feature_name, state, feature_table[feature_name]['has_timer'])
330332

331333
def start(self):
332334
# Update all feature states once upon starting

0 commit comments

Comments
 (0)