|
3 | 3 | import contextlib
|
4 | 4 | import os
|
5 | 5 | import sys
|
| 6 | +import shutil |
6 | 7 | import stat
|
7 | 8 | import subprocess
|
| 9 | +import tempfile |
8 | 10 | from collections import defaultdict
|
9 | 11 | from typing import Dict, Type, List
|
10 | 12 |
|
|
32 | 34 |
|
33 | 35 | SYSTEMD_LOCATION = '/usr/lib/systemd/system'
|
34 | 36 |
|
| 37 | +GENERATED_SERVICES_CONF_FILE = '/etc/sonic/generated_services.conf' |
| 38 | + |
35 | 39 | SERVICE_MGMT_SCRIPT_TEMPLATE = 'service_mgmt.sh.j2'
|
36 | 40 | SERVICE_MGMT_SCRIPT_LOCATION = '/usr/local/bin'
|
37 | 41 |
|
@@ -163,6 +167,7 @@ def create(self,
|
163 | 167 | self.generate_service_mgmt(package)
|
164 | 168 | self.update_dependent_list_file(package)
|
165 | 169 | self.generate_systemd_service(package)
|
| 170 | + self.update_generated_services_conf_file(package) |
166 | 171 | self.generate_dump_script(package)
|
167 | 172 | self.generate_service_reconciliation_file(package)
|
168 | 173 | self.install_yang_module(package)
|
@@ -199,6 +204,7 @@ def remove(self,
|
199 | 204 | remove_if_exists(os.path.join(DEBUG_DUMP_SCRIPT_LOCATION, f'{name}'))
|
200 | 205 | remove_if_exists(os.path.join(ETC_SONIC_PATH, f'{name}_reconcile'))
|
201 | 206 | self.update_dependent_list_file(package, remove=True)
|
| 207 | + self.update_dependent_list_file(package, remove=True) |
202 | 208 |
|
203 | 209 | if deregister_feature and not keep_config:
|
204 | 210 | self.remove_config(package)
|
@@ -320,6 +326,36 @@ def generate_systemd_service(self, package: Package):
|
320 | 326 | render_template(template, output_file, template_vars)
|
321 | 327 | log.info(f'generated {output_file}')
|
322 | 328 |
|
| 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 | + |
323 | 359 | def update_dependent_list_file(self, package: Package, remove=False):
|
324 | 360 | """ This function updates dependent list file for packages listed in "dependent-of"
|
325 | 361 | (path: /etc/sonic/<service>_dependent file).
|
|
0 commit comments