diff options
Diffstat (limited to 'vicn/resource/linux/package_manager.py')
-rw-r--r-- | vicn/resource/linux/package_manager.py | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/vicn/resource/linux/package_manager.py b/vicn/resource/linux/package_manager.py index 86b7057a..eaf83e17 100644 --- a/vicn/resource/linux/package_manager.py +++ b/vicn/resource/linux/package_manager.py @@ -19,7 +19,7 @@ import asyncio import logging -from netmodel.model.type import String +from netmodel.model.type import String, Bool from vicn.core.attribute import Attribute, Multiplicity from vicn.core.exception import ResourceNotFound from vicn.core.requirement import Requirement @@ -63,7 +63,7 @@ class PackageManager(Resource): Resource: PackageManager APT package management wrapper. - + Todo: - We assume a package manager is always installed on every machine. - Currently, we limit ourselves to debian/ubuntu, and voluntarily don't @@ -79,6 +79,9 @@ class PackageManager(Resource): reverse_auto = True, mandatory = True, multiplicity = Multiplicity.OneToOne) + trusted = Attribute(Bool, + description="Force repository trust", + default=False) #-------------------------------------------------------------------------- # Constructor and Accessors @@ -94,34 +97,28 @@ class PackageManager(Resource): #-------------------------------------------------------------------------- def __after__(self): - if self.node.__class__.__name__ == 'Physical': - # UGLY : This blocking code is currently needed - task = self.node.host_interface._get_ip4_address() - ip_dict = task.execute_blocking() - self.node.host_interface.ip4_address = ip_dict['ip4_address'] - return ('Repository',) - else: - return ('Repository', 'CentralIP', 'RoutingTable') + return ('Repository',) @inline_task def __get__(self): raise ResourceNotFound - def __create__(self): + #--------------------------------------------------------------------------- + # Methods + #--------------------------------------------------------------------------- + + def __method_setup_repositories__(self): repos = EmptyTask() for repository in self._state.manager.by_type_str('Repository'): deb_source = self._get_deb_source(repository) path = self._get_path(repository) - repo = BashTask(self.node, CMD_SETUP_REPO, + # XXX There is no need to setup a repo if there is no package to install + repo = BashTask(self.node, CMD_SETUP_REPO, {'deb_source': deb_source, 'path': path}) repos = repos | repo - return repos + return repos - #--------------------------------------------------------------------------- - # Methods - #--------------------------------------------------------------------------- - def __method_update__(self): kill = BashTask(self.node, CMD_APT_GET_KILL, {'node': self.node.name}, lock = self.apt_lock) @@ -139,13 +136,12 @@ class PackageManager(Resource): else: update = EmptyTask() - return (kill > dpkg_configure_a) > update + return (self.__method_setup_repositories__() > (kill > dpkg_configure_a)) > update def __method_install__(self, package_name): - update = self.__method_update__() install = BashTask(self.node, CMD_PKG_INSTALL, {'package_name': package_name}, lock = self.apt_lock) - return update > install + return self.__method_update__() > install #--------------------------------------------------------------------------- # Internal methods @@ -158,10 +154,20 @@ class PackageManager(Resource): return '/etc/apt/sources.list.d/{}.list'.format(repository.repo_name) def _get_deb_source(self, repository): - path = repository.node.host_interface.ip4_address + '/' + protocol = 'https' if repository.ssl else 'http' + path = repository.node.hostname + '/' if repository.directory: path += repository.directory + '/' - return 'deb http://{} {}/'.format(path, self.node.dist) + trusted = '[trusted=yes] ' if self.trusted else '' + if repository.sections: + sections = ' {}'.format(' '.join(repository.sections)) + else: + sections = '' + if '$DISTRIBUTION' in path: + path = path.replace('$DISTRIBUTION', self.node.dist) + return 'deb {}{}://{} ./{}'.format(trusted, protocol, path, sections) + else: + return 'deb {}{}://{} {}{}'.format(trusted, protocol, path, self.node.dist, sections) #------------------------------------------------------------------------------ @@ -173,7 +179,7 @@ class Package(Resource): """ package_name = Attribute(String, mandatory = True) - node = Attribute(Node, + node = Attribute(Node, mandatory = True, requirements=[ Requirement('package_manager') @@ -208,7 +214,7 @@ class Packages(Resource): since package_names are static for a resource, this is not a problem here. """ names = Attribute(String, multiplicity = Multiplicity.OneToMany) - node = Attribute(Node, + node = Attribute(Node, mandatory = True, requirements=[ Requirement('package_manager') @@ -229,4 +235,3 @@ class Packages(Resource): return Resource.__concurrent__(*packages) else: return None - |