3939from sonic_package_manager .progress import ProgressManager
4040from sonic_package_manager .reference import PackageReference
4141from sonic_package_manager .registry import RegistryResolver
42+ from sonic_package_manager .service_creator import SONIC_CLI_COMMANDS
4243from sonic_package_manager .service_creator .creator import (
4344 ServiceCreator ,
4445 run_command
5253 RegistrySource ,
5354 TarballSource
5455)
55- from sonic_package_manager .utils import DockerReference
5656from sonic_package_manager .version import (
5757 Version ,
5858 version_to_tag ,
@@ -101,7 +101,7 @@ def wrapped_function(*args, **kwargs):
101101 return wrapped_function
102102
103103
104- def rollback (func , * args , ** kwargs ):
104+ def rollback (func , * args , ** kwargs ) -> Callable :
105105 """ Used in rollback callbacks to ignore failure
106106 but proceed with rollback. Error will be printed
107107 but not fail the whole procedure of rollback. """
@@ -131,7 +131,7 @@ def package_constraint_to_reference(constraint: PackageConstraint) -> PackageRef
131131 return PackageReference (package_name , version_to_tag (version ))
132132
133133
134- def parse_reference_expression (expression ):
134+ def parse_reference_expression (expression ) -> PackageReference :
135135 try :
136136 return package_constraint_to_reference (PackageConstraint .parse (expression ))
137137 except ValueError :
@@ -247,7 +247,7 @@ def validate_package_tree(packages: Dict[str, Package]):
247247 continue
248248
249249 component_version = conflicting_package .components [component ]
250- log .debug (f'conflicting package { dependency .name } : '
250+ log .debug (f'conflicting package { conflict .name } : '
251251 f'component { component } version is { component_version } ' )
252252
253253 if constraint .allows (component_version ):
@@ -397,12 +397,17 @@ def install_from_source(self,
397397 if not self .database .has_package (package .name ):
398398 self .database .add_package (package .name , package .repository )
399399
400+ service_create_opts = {
401+ 'state' : feature_state ,
402+ 'owner' : default_owner ,
403+ }
404+
400405 try :
401406 with contextlib .ExitStack () as exits :
402407 source .install (package )
403408 exits .callback (rollback (source .uninstall , package ))
404409
405- self .service_creator .create (package , state = feature_state , owner = default_owner )
410+ self .service_creator .create (package , ** service_create_opts )
406411 exits .callback (rollback (self .service_creator .remove , package ))
407412
408413 self .service_creator .generate_shutdown_sequence_files (
@@ -481,13 +486,7 @@ def uninstall(self, name: str, force=False):
481486 self .service_creator .generate_shutdown_sequence_files (
482487 self ._get_installed_packages_except (package )
483488 )
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 )
491490 self .docker .rmi (package .image_id , force = True )
492491 package .entry .image_id = None
493492 except Exception as err :
@@ -563,6 +562,13 @@ def upgrade_from_source(self,
563562
564563 # After all checks are passed we proceed to actual upgrade
565564
565+ service_create_opts = {
566+ 'register_feature' : False ,
567+ }
568+ service_remove_opts = {
569+ 'deregister_feature' : False ,
570+ }
571+
566572 try :
567573 with contextlib .ExitStack () as exits :
568574 self ._uninstall_cli_plugins (old_package )
@@ -576,19 +582,15 @@ def upgrade_from_source(self,
576582 exits .callback (rollback (self ._systemctl_action ,
577583 old_package , 'start' ))
578584
579- self .service_creator .remove (old_package , deregister_feature = False )
585+ self .service_creator .remove (old_package , ** service_remove_opts )
580586 exits .callback (rollback (self .service_creator .create , old_package ,
581- register_feature = False ))
587+ ** service_create_opts ))
582588
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 )
588590
589- self .service_creator .create (new_package , register_feature = False )
591+ self .service_creator .create (new_package , ** service_create_opts )
590592 exits .callback (rollback (self .service_creator .remove , new_package ,
591- register_feature = False ))
593+ ** service_remove_opts ))
592594
593595 self .service_creator .generate_shutdown_sequence_files (
594596 self ._get_installed_packages_and (new_package )
@@ -654,16 +656,16 @@ def migrate_packages(self,
654656 old_package_database : PackageDatabase ,
655657 dockerd_sock : Optional [str ] = None ):
656658 """
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
667669 installed image.
668670
669671 Args:
@@ -784,7 +786,7 @@ def get_package_source(self,
784786 ref = parse_reference_expression (package_expression )
785787 return self .get_package_source (package_ref = ref )
786788 elif repository_reference :
787- repo_ref = DockerReference .parse (repository_reference )
789+ repo_ref = utils . DockerReference .parse (repository_reference )
788790 repository = repo_ref ['name' ]
789791 reference = repo_ref ['tag' ] or repo_ref ['digest' ]
790792 reference = reference or 'latest'
@@ -815,8 +817,8 @@ def get_package_source(self,
815817 if package_entry .default_reference is not None :
816818 package_ref .reference = package_entry .default_reference
817819 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' )
820822
821823 return RegistrySource (package_entry .repository ,
822824 package_ref .reference ,
@@ -888,7 +890,7 @@ def get_installed_packages_list(self) -> List[Package]:
888890 Installed packages dictionary.
889891 """
890892
891- return [self .get_installed_package (entry .name )
893+ return [self .get_installed_package (entry .name )
892894 for entry in self .database if entry .installed ]
893895
894896 def _migrate_package_database (self , old_package_database : PackageDatabase ):
@@ -948,11 +950,11 @@ def _systemctl_action(self, package: Package, action: str):
948950 run_command (f'systemctl { action } { name } @{ npu } ' )
949951
950952 def _install_cli_plugins (self , package : Package ):
951- for command in ( 'show' , 'config' , 'clear' ) :
953+ for command in SONIC_CLI_COMMANDS :
952954 self ._install_cli_plugin (package , command )
953955
954956 def _uninstall_cli_plugins (self , package : Package ):
955- for command in ( 'show' , 'config' , 'clear' ) :
957+ for command in SONIC_CLI_COMMANDS :
956958 self ._uninstall_cli_plugin (package , command )
957959
958960 def _install_cli_plugin (self , package : Package , command : str ):
@@ -978,12 +980,17 @@ def get_manager() -> 'PackageManager':
978980 PackageManager
979981 """
980982
981- docker_api = DockerApi (docker .from_env ())
983+ docker_api = DockerApi (docker .from_env (), ProgressManager () )
982984 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 ,
984991 registry_resolver ,
985992 PackageDatabase .from_file (),
986- MetadataResolver ( docker_api , registry_resolver ) ,
987- ServiceCreator ( FeatureRegistry ( SonicDB ), SonicDB ) ,
993+ metadata_resolver ,
994+ service_creator ,
988995 device_info ,
989996 filelock .FileLock (PACKAGE_MANAGER_LOCK_FILE , timeout = 0 ))
0 commit comments