def install_package()

in VMExtension/hpcnodemanager.py [0:0]


def install_package(package_name):
    if DistroName in ["centos", "redhat", "almalinux", "rocky"]:
        cmd = "yum -y install " + package_name
    elif DistroName == "ubuntu":
        waagent.Log("Updating apt package lists with command: apt-get -y update")
        exitcode = waagent.Run("apt-get -y update", chk_err=False)
        if exitcode != 0:
            waagent.Log("Update apt package lists failed with exitcode: {0}".format(exitcode))
        cmd = "apt-get -y install " + package_name
    elif DistroName == "suse":
        if not os.listdir('/etc/zypp/repos.d'):
            waagent.Run("zypper ar http://download.opensuse.org/distribution/13.2/repo/oss/suse/ opensuse")
            cmd = "zypper -n --gpg-auto-import-keys install --force-resolution -l " + package_name
        else:
            cmd = "zypper -n install --force-resolution -l " + package_name
    else:
        raise Exception("Unsupported Linux Distro.")
    waagent.Log("The command to install {0}: {1}".format(package_name, cmd))
    attempt = 1
    while(True):
        waagent.Log("Installing package {0} (Attempt {1})".format(package_name, attempt))
        retcode, retoutput = waagent.RunGetOutput(cmd)
        if retcode == 0:
            waagent.Log("package {0} installation succeeded".format(package_name))
            break
        else:
            waagent.Log("package {0} installation failed {1}:\n {2}".format(package_name, retcode, retoutput))
            if attempt < 10:
                time.sleep(min(30, pow(2, attempt)))
                attempt += 1
                if DistroName == 'suse' and retcode == 104:
                    waagent.Run("zypper ar http://download.opensuse.org/distribution/13.2/repo/oss/suse/ opensuse")
                    cmd = "zypper -n --gpg-auto-import-keys install --force-resolution -l " + package_name
                elif DistroName == "ubuntu":
                    waagent.Run("apt-get -y update", chk_err=False)
                continue
            else:
                raise Exception("failed to install package {0}:{1}".format(package_name, retcode))