Skip to content

Commit 47777c8

Browse files
[sonic-package-manager] add generated service to /etc/sonic/generated_services.conf
Signed-off-by: Stepan Blyschak <[email protected]>
1 parent bf9c07c commit 47777c8

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

sonic_package_manager/service_creator/creator.py

+36
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
import contextlib
44
import os
55
import sys
6+
import shutil
67
import stat
78
import subprocess
9+
import tempfile
810
from collections import defaultdict
911
from typing import Dict, Type, List
1012

@@ -32,6 +34,8 @@
3234

3335
SYSTEMD_LOCATION = '/usr/lib/systemd/system'
3436

37+
GENERATED_SERVICES_CONF_FILE = '/etc/sonic/generated_services.conf'
38+
3539
SERVICE_MGMT_SCRIPT_TEMPLATE = 'service_mgmt.sh.j2'
3640
SERVICE_MGMT_SCRIPT_LOCATION = '/usr/local/bin'
3741

@@ -163,6 +167,7 @@ def create(self,
163167
self.generate_service_mgmt(package)
164168
self.update_dependent_list_file(package)
165169
self.generate_systemd_service(package)
170+
self.update_generated_services_conf_file(package)
166171
self.generate_dump_script(package)
167172
self.generate_service_reconciliation_file(package)
168173
self.install_yang_module(package)
@@ -199,6 +204,7 @@ def remove(self,
199204
remove_if_exists(os.path.join(DEBUG_DUMP_SCRIPT_LOCATION, f'{name}'))
200205
remove_if_exists(os.path.join(ETC_SONIC_PATH, f'{name}_reconcile'))
201206
self.update_dependent_list_file(package, remove=True)
207+
self.update_dependent_list_file(package, remove=True)
202208

203209
if deregister_feature and not keep_config:
204210
self.remove_config(package)
@@ -320,6 +326,36 @@ def generate_systemd_service(self, package: Package):
320326
render_template(template, output_file, template_vars)
321327
log.info(f'generated {output_file}')
322328

329+
def update_generated_services_conf_file(self, package: Package, remove=False):
330+
""" Updates generated_services.conf file.
331+
332+
Args:
333+
package: Package to update generated_services.conf with.
334+
remove: True if update for removal process.
335+
Returns:
336+
None.
337+
"""
338+
name = package.manifest['service']['name']
339+
asic_service= package.manifest['service']['asic-service']
340+
341+
with open(GENERATED_SERVICES_CONF_FILE, 'r') as generated_services_conf_file:
342+
list_of_services = set(generated_services_conf_file.read().split())
343+
344+
if not remove:
345+
list_of_services.add(f'{name}.service')
346+
if asic_service:
347+
list_of_services.add(f'{name}@.service')
348+
else:
349+
list_of_services.discard(f'{name}.service')
350+
list_of_services.discard(f'{name}@.service')
351+
352+
# Write to tmp file and replace the original file with it
353+
with tempfile.NamedTemporaryFile('w', delete=False) as tmp:
354+
tmp.write('\n'.join(list_of_services))
355+
tmp.flush()
356+
357+
shutil.move(tmp.name, GENERATED_SERVICES_CONF_FILE)
358+
323359
def update_dependent_list_file(self, package: Package, remove=False):
324360
""" This function updates dependent list file for packages listed in "dependent-of"
325361
(path: /etc/sonic/<service>_dependent file).

tests/sonic_package_manager/conftest.py

+1
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ def sonic_fs(fs):
408408
fs.create_dir(SYSTEMD_LOCATION)
409409
fs.create_dir(DOCKER_CTL_SCRIPT_LOCATION)
410410
fs.create_dir(SERVICE_MGMT_SCRIPT_LOCATION)
411+
fs.create_file(GENERATED_SERVICES_CONF_FILE)
411412
fs.create_file(os.path.join(TEMPLATES_PATH, SERVICE_FILE_TEMPLATE))
412413
fs.create_file(os.path.join(TEMPLATES_PATH, TIMER_UNIT_TEMPLATE))
413414
fs.create_file(os.path.join(TEMPLATES_PATH, SERVICE_MGMT_SCRIPT_TEMPLATE))

tests/sonic_package_manager/test_service_creator.py

+2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def service_creator(mock_feature_registry,
9595

9696
def test_service_creator(sonic_fs, manifest, service_creator, package_manager):
9797
entry = PackageEntry('test', 'azure/sonic-test')
98+
manifest['service']['asic-service'] = True
9899
package = Package(entry, Metadata(manifest))
99100
installed_packages = package_manager._get_installed_packages_and(package)
100101
service_creator.create(package)
@@ -112,6 +113,7 @@ def read_file(name):
112113
assert read_file('warm-reboot_order') == 'swss teamd test syncd'
113114
assert read_file('fast-reboot_order') == 'teamd test swss syncd'
114115
assert read_file('test_reconcile') == 'test-process test-process-3'
116+
assert set(read_file('generated_services.conf').split()) == set(['test.service', '[email protected]'])
115117

116118

117119
def test_service_creator_with_timer_unit(sonic_fs, manifest, service_creator):

0 commit comments

Comments
 (0)