Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
  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
Esempio n. 4
0
    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))
Esempio n. 5
0
 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)
Esempio n. 6
0
    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)