39
39
from sonic_package_manager .progress import ProgressManager
40
40
from sonic_package_manager .reference import PackageReference
41
41
from sonic_package_manager .registry import RegistryResolver
42
+ from sonic_package_manager .service_creator import SONIC_CLI_COMMANDS
42
43
from sonic_package_manager .service_creator .creator import (
43
44
ServiceCreator ,
44
45
run_command
52
53
RegistrySource ,
53
54
TarballSource
54
55
)
55
- from sonic_package_manager .utils import DockerReference
56
56
from sonic_package_manager .version import (
57
57
Version ,
58
58
version_to_tag ,
@@ -101,7 +101,7 @@ def wrapped_function(*args, **kwargs):
101
101
return wrapped_function
102
102
103
103
104
- def rollback (func , * args , ** kwargs ):
104
+ def rollback (func , * args , ** kwargs ) -> Callable :
105
105
""" Used in rollback callbacks to ignore failure
106
106
but proceed with rollback. Error will be printed
107
107
but not fail the whole procedure of rollback. """
@@ -131,7 +131,7 @@ def package_constraint_to_reference(constraint: PackageConstraint) -> PackageRef
131
131
return PackageReference (package_name , version_to_tag (version ))
132
132
133
133
134
- def parse_reference_expression (expression ):
134
+ def parse_reference_expression (expression ) -> PackageReference :
135
135
try :
136
136
return package_constraint_to_reference (PackageConstraint .parse (expression ))
137
137
except ValueError :
@@ -247,7 +247,7 @@ def validate_package_tree(packages: Dict[str, Package]):
247
247
continue
248
248
249
249
component_version = conflicting_package .components [component ]
250
- log .debug (f'conflicting package { dependency .name } : '
250
+ log .debug (f'conflicting package { conflict .name } : '
251
251
f'component { component } version is { component_version } ' )
252
252
253
253
if constraint .allows (component_version ):
@@ -397,12 +397,17 @@ def install_from_source(self,
397
397
if not self .database .has_package (package .name ):
398
398
self .database .add_package (package .name , package .repository )
399
399
400
+ service_create_opts = {
401
+ 'state' : feature_state ,
402
+ 'owner' : default_owner ,
403
+ }
404
+
400
405
try :
401
406
with contextlib .ExitStack () as exits :
402
407
source .install (package )
403
408
exits .callback (rollback (source .uninstall , package ))
404
409
405
- self .service_creator .create (package , state = feature_state , owner = default_owner )
410
+ self .service_creator .create (package , ** service_create_opts )
406
411
exits .callback (rollback (self .service_creator .remove , package ))
407
412
408
413
self .service_creator .generate_shutdown_sequence_files (
@@ -481,13 +486,7 @@ def uninstall(self, name: str, force=False):
481
486
self .service_creator .generate_shutdown_sequence_files (
482
487
self ._get_installed_packages_except (package )
483
488
)
484
-
485
- # Clean containers based on this image
486
- containers = self .docker .ps (filters = {'ancestor' : package .image_id },
487
- all = True )
488
- for container in containers :
489
- self .docker .rm (container .id , force = True )
490
-
489
+ self .docker .rm_by_ancestor (package .image_id , force = True )
491
490
self .docker .rmi (package .image_id , force = True )
492
491
package .entry .image_id = None
493
492
except Exception as err :
@@ -563,6 +562,13 @@ def upgrade_from_source(self,
563
562
564
563
# After all checks are passed we proceed to actual upgrade
565
564
565
+ service_create_opts = {
566
+ 'register_feature' : False ,
567
+ }
568
+ service_remove_opts = {
569
+ 'deregister_feature' : False ,
570
+ }
571
+
566
572
try :
567
573
with contextlib .ExitStack () as exits :
568
574
self ._uninstall_cli_plugins (old_package )
@@ -576,19 +582,15 @@ def upgrade_from_source(self,
576
582
exits .callback (rollback (self ._systemctl_action ,
577
583
old_package , 'start' ))
578
584
579
- self .service_creator .remove (old_package , deregister_feature = False )
585
+ self .service_creator .remove (old_package , ** service_remove_opts )
580
586
exits .callback (rollback (self .service_creator .create , old_package ,
581
- register_feature = False ))
587
+ ** service_create_opts ))
582
588
583
- # Clean containers based on the old image
584
- containers = self .docker .ps (filters = {'ancestor' : old_package .image_id },
585
- all = True )
586
- for container in containers :
587
- self .docker .rm (container .id , force = True )
589
+ self .docker .rm_by_ancestor (old_package .image_id , force = True )
588
590
589
- self .service_creator .create (new_package , register_feature = False )
591
+ self .service_creator .create (new_package , ** service_create_opts )
590
592
exits .callback (rollback (self .service_creator .remove , new_package ,
591
- register_feature = False ))
593
+ ** service_remove_opts ))
592
594
593
595
self .service_creator .generate_shutdown_sequence_files (
594
596
self ._get_installed_packages_and (new_package )
@@ -654,16 +656,16 @@ def migrate_packages(self,
654
656
old_package_database : PackageDatabase ,
655
657
dockerd_sock : Optional [str ] = None ):
656
658
"""
657
- Migrate packages from old database. This function can do a comparison between
658
- current database and the database passed in as argument. If the package is
659
- missing in the current database it will be added. If the package is installed
660
- in the passed database and in the current it is not installed it will be
661
- installed with a passed database package version. If the package is installed
662
- in the passed database and it is installed in the current database but with
663
- older version the package will be upgraded to the never version. If the package
664
- is installed in the passed database and in the current it is installed but with
665
- never version - no actions are taken. If dockerd_sock parameter is passed, the
666
- migration process will use loaded images from docker library of the currently
659
+ Migrate packages from old database. This function can do a comparison between
660
+ current database and the database passed in as argument. If the package is
661
+ missing in the current database it will be added. If the package is installed
662
+ in the passed database and in the current it is not installed it will be
663
+ installed with a passed database package version. If the package is installed
664
+ in the passed database and it is installed in the current database but with
665
+ older version the package will be upgraded to the never version. If the package
666
+ is installed in the passed database and in the current it is installed but with
667
+ never version - no actions are taken. If dockerd_sock parameter is passed, the
668
+ migration process will use loaded images from docker library of the currently
667
669
installed image.
668
670
669
671
Args:
@@ -784,7 +786,7 @@ def get_package_source(self,
784
786
ref = parse_reference_expression (package_expression )
785
787
return self .get_package_source (package_ref = ref )
786
788
elif repository_reference :
787
- repo_ref = DockerReference .parse (repository_reference )
789
+ repo_ref = utils . DockerReference .parse (repository_reference )
788
790
repository = repo_ref ['name' ]
789
791
reference = repo_ref ['tag' ] or repo_ref ['digest' ]
790
792
reference = reference or 'latest'
@@ -815,8 +817,8 @@ def get_package_source(self,
815
817
if package_entry .default_reference is not None :
816
818
package_ref .reference = package_entry .default_reference
817
819
else :
818
- raise PackageManagerError (f 'No default reference tag. '
819
- f 'Please specify the version or tag explicitly' )
820
+ raise PackageManagerError ('No default reference tag. '
821
+ 'Please specify the version or tag explicitly' )
820
822
821
823
return RegistrySource (package_entry .repository ,
822
824
package_ref .reference ,
@@ -888,7 +890,7 @@ def get_installed_packages_list(self) -> List[Package]:
888
890
Installed packages dictionary.
889
891
"""
890
892
891
- return [self .get_installed_package (entry .name )
893
+ return [self .get_installed_package (entry .name )
892
894
for entry in self .database if entry .installed ]
893
895
894
896
def _migrate_package_database (self , old_package_database : PackageDatabase ):
@@ -948,11 +950,11 @@ def _systemctl_action(self, package: Package, action: str):
948
950
run_command (f'systemctl { action } { name } @{ npu } ' )
949
951
950
952
def _install_cli_plugins (self , package : Package ):
951
- for command in ( 'show' , 'config' , 'clear' ) :
953
+ for command in SONIC_CLI_COMMANDS :
952
954
self ._install_cli_plugin (package , command )
953
955
954
956
def _uninstall_cli_plugins (self , package : Package ):
955
- for command in ( 'show' , 'config' , 'clear' ) :
957
+ for command in SONIC_CLI_COMMANDS :
956
958
self ._uninstall_cli_plugin (package , command )
957
959
958
960
def _install_cli_plugin (self , package : Package , command : str ):
@@ -978,12 +980,17 @@ def get_manager() -> 'PackageManager':
978
980
PackageManager
979
981
"""
980
982
981
- docker_api = DockerApi (docker .from_env ())
983
+ docker_api = DockerApi (docker .from_env (), ProgressManager () )
982
984
registry_resolver = RegistryResolver ()
983
- return PackageManager (DockerApi (docker .from_env (), ProgressManager ()),
985
+ metadata_resolver = MetadataResolver (docker_api , registry_resolver )
986
+ feature_registry = FeatureRegistry (SonicDB )
987
+ service_creator = ServiceCreator (feature_registry ,
988
+ SonicDB )
989
+
990
+ return PackageManager (docker_api ,
984
991
registry_resolver ,
985
992
PackageDatabase .from_file (),
986
- MetadataResolver ( docker_api , registry_resolver ) ,
987
- ServiceCreator ( FeatureRegistry ( SonicDB ), SonicDB ) ,
993
+ metadata_resolver ,
994
+ service_creator ,
988
995
device_info ,
989
996
filelock .FileLock (PACKAGE_MANAGER_LOCK_FILE , timeout = 0 ))
0 commit comments