def get_stack_version_before_packages_installed(self): """ This works in a lazy way (calculates the version first time and stores it). If you need to recalculate the version explicitly set: Script.stack_version_from_distro_select = None before the call. However takes a bit of time, so better to avoid. :return: stack version including the build number. e.g.: 2.3.4.0-1234. """ # preferred way is to get the actual selected version of current component component_name = self.get_component_name() if not Script.stack_version_from_distro_select and component_name: from resource_management.libraries.functions import stack_select Script.stack_version_from_distro_select = stack_select.get_stack_version_before_install( component_name) # If <stack-selector-tool> has not yet been done (situations like first install), # we can use <stack-selector-tool> version itself. # Wildcards cause a lot of troubles with installing packages, if the version contains wildcards we should try to specify it. if not Script.stack_version_from_distro_select or '*' in Script.stack_version_from_distro_select: # FIXME: this method is not reliable to get stack-selector-version # as if there are multiple versions installed with different <stack-selector-tool>, we won't detect the older one (if needed). Script.stack_version_from_distro_select = packages_analyzer.getInstalledPackageVersion( stack_tools.get_stack_tool_package( stack_tools.STACK_SELECTOR_NAME)) return Script.stack_version_from_distro_select
def get_stack_version_before_packages_installed(self): """ This works in a lazy way (calculates the version first time and stores it). If you need to recalculate the version explicitly set: Script.stack_version_from_distro_select = None before the call. However takes a bit of time, so better to avoid. :return: stack version including the build number. e.g.: 2.3.4.0-1234. """ # preferred way is to get the actual selected version of current component component_name = self.get_component_name() if not Script.stack_version_from_distro_select and component_name: from resource_management.libraries.functions import stack_select Script.stack_version_from_distro_select = stack_select.get_stack_version_before_install( component_name) # If <stack-selector-tool> has not yet been done (situations like first install), # we can use <stack-selector-tool> version itself. if not Script.stack_version_from_distro_select: Script.stack_version_from_distro_select = packages_analyzer.getInstalledPackageVersion( stack_tools.get_stack_tool_package( stack_tools.STACK_SELECTOR_NAME)) return Script.stack_version_from_distro_select
def get_stack_version_before_packages_installed(self): """ This works in a lazy way (calculates the version first time and stores it). If you need to recalculate the version explicitly set: Script.stack_version_from_distro_select = None before the call. However takes a bit of time, so better to avoid. :return: stack version including the build number. e.g.: 2.3.4.0-1234. """ # preferred way is to get the actual selected version of current component component_name = self.get_component_name() if not Script.stack_version_from_distro_select and component_name: from resource_management.libraries.functions import stack_select Script.stack_version_from_distro_select = stack_select.get_stack_version_before_install(component_name) # If <stack-selector-tool> has not yet been done (situations like first install), # we can use <stack-selector-tool> version itself. # Wildcards cause a lot of troubles with installing packages, if the version contains wildcards we should try to specify it. if not Script.stack_version_from_distro_select or '*' in Script.stack_version_from_distro_select: # FIXME: this method is not reliable to get stack-selector-version # as if there are multiple versions installed with different <stack-selector-tool>, we won't detect the older one (if needed). Script.stack_version_from_distro_select = packages_analyzer.getInstalledPackageVersion( stack_tools.get_stack_tool_package(stack_tools.STACK_SELECTOR_NAME)) return Script.stack_version_from_distro_select
def _fix_default_links_for_current(self): """ If a prior version of Ambari did not correctly reverse the conf symlinks, then they would be put into a bad state when distributing a new stack. For example: /etc/component/conf (directory) <stack-root>/v1/component/conf -> /etc/component/conf When distributing v2, we'd detect the /etc/component/conf problems and would try to adjust it: /etc/component/conf -> <stack-root>/current/component/conf <stack-root>/v2/component/conf -> /etc/component/v2/0 The problem is that v1 never gets changed (since the stack being distributed is v2), and we end up with a circular link: /etc/component/conf -> <stack-root>/current/component/conf <stack-root>/v1/component/conf -> /etc/component/conf :return: None """ Logger.info( "Attempting to fix any configuration symlinks which are not in the correct state" ) from resource_management.libraries.functions import stack_select restricted_packages = conf_select.get_restricted_packages() if 0 == len(restricted_packages): Logger.info( "There are no restricted conf-select packages for this installation" ) else: Logger.info("Restricting conf-select packages to {0}".format( restricted_packages)) for package_name, directories in conf_select.get_package_dirs( ).iteritems(): Logger.info( "Attempting to fix the default conf links for {0}".format( package_name)) Logger.info( "The following directories will be fixed for {0}: {1}".format( package_name, str(directories))) component_name = None for directory_struct in directories: if "component" in directory_struct: component_name = directory_struct["component"] if component_name: stack_version = stack_select.get_stack_version_before_install( component_name) if 0 == len(restricted_packages ) or package_name in restricted_packages: if stack_version: conf_select.convert_conf_directories_to_symlinks( package_name, stack_version, directories) else: Logger.warning( "Unable to fix {0} since there is no known installed version for this component" .format(package_name))
def create_30_config_version(self, env): package_name = 'registry' stack_root = Script.get_stack_root() current_dir = "{0}/current/registry/conf".format(stack_root) directories = [{ "conf_dir": "/etc/registry/conf", "current_dir": current_dir }] stack_version = stack_select.get_stack_version_before_install( package_name) conf_dir = "/etc/registry/conf" if stack_version: try: #Check if broken symbolic links issue exists os.stat(conf_dir) conf_select.convert_conf_directories_to_symlinks( package_name, stack_version, directories) cp_cmd = as_sudo([ "cp", "-a", "-f", "/etc/registry/conf.backup/.", "/etc/registry/conf" ]) Execute(cp_cmd, logoutput=True) except OSError as e: Logger.warning( "Detected broken symlink : {0}. Attempting to repair.". format(str(e))) #removing symlink conf directory sudo.unlink(conf_dir) #make conf dir again sudo.makedirs(conf_dir, 0755) #copy all files for files in glob.glob("/etc/registry/conf.backup/*"): cp_cmd = as_sudo(["cp", "-r", files, conf_dir]) Execute(cp_cmd, logoutput=True) conf_select.convert_conf_directories_to_symlinks( package_name, stack_version, directories)
def _fix_default_links(self, package_name, component_name): """ If a prior version of Ambari did not correctly reverse the conf symlinks, then they would be put into a bad state when distributing a new stack. For example: /etc/component/conf (directory) <stack-root>/v1/component/conf -> /etc/component/conf When distributing v2, we'd detect the /etc/component/conf problems and would try to adjust it: /etc/component/conf -> <stack-root>/current/component/conf <stack-root>/v2/component/conf -> /etc/component/v2/0 The problem is that v1 never gets changed (since the stack being distributed is v2), and we end up with a circular link: /etc/component/conf -> <stack-root>/current/component/conf <stack-root>/v1/component/conf -> /etc/component/conf :return: None """ from resource_management.libraries.functions import stack_select package_dirs = conf_select.get_package_dirs() if package_name in package_dirs: Logger.info( "Determining if the default conf links for {0} need to be fixed" .format(package_name)) directories = package_dirs[package_name] Logger.info( "The following directories will be checked for {0}: {1}". format(package_name, str(directories))) stack_version = stack_select.get_stack_version_before_install( component_name) if stack_version: conf_select.convert_conf_directories_to_symlinks( package_name, stack_version, directories)