Commit a7eb1fad authored by Reimar Stier's avatar Reimar Stier

Support to install anaconda

parent cabbba7e
---
# defaults file for conda_installer
conda_installer_version: "latest"
# distribution may be either miniconda or anaconda
conda_installer_distribution: "miniconda"
......@@ -7,15 +7,26 @@ from ansible.module_utils.urls import open_url
from ansible.plugins.lookup import LookupBase
from bs4 import BeautifulSoup
URL_ANACONDA = "https://repo.anaconda.com/archive/"
URL_MINICONDA = "https://repo.continuum.io/miniconda/"
PATTERN_PYTHON = re.compile(
r"Miniconda(?P<python>\d+)-(?P<version>[0-9]+.[0-9]+.[0-9]+|latest)-(?P<os>\w+)-(?P<arch>\w+).\w+")
MINICONDA = "miniconda"
ANACONDA = "anaconda"
BASE_URL = {
MINICONDA: "https://repo.continuum.io/miniconda/",
ANACONDA: "https://repo.anaconda.com/archive/",
}
PATTERN_FILENAME = {
MINICONDA: re.compile(
r"Miniconda(?P<python>\d+)-(?P<version>[0-9]+.[0-9]+.[0-9]+|latest)-(?P<os>\w+)-(?P<arch>\w+).\w+"),
ANACONDA: re.compile(
r"Anaconda(?P<python>\d+)-(?P<version>[0-9]+.[0-9]+|latest)-(?P<os>\w+)-(?P<arch>\w+).\w+"),
}
RELEASE_MAX_AGE_DAYS = 365
def fetch_miniconda_releases(architecture="x86_64", python_version="3", release_max_age_days=RELEASE_MAX_AGE_DAYS):
request = open_url(url=URL_MINICONDA, method="GET")
def fetch_releases(distribution=MINICONDA, architecture="x86_64", python_version="3",
release_max_age_days=RELEASE_MAX_AGE_DAYS):
base_url = BASE_URL[distribution]
request = open_url(url=base_url, method="GET")
response = request.read()
data = {}
......@@ -29,37 +40,61 @@ def fetch_miniconda_releases(architecture="x86_64", python_version="3", release_
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
release = {key: value for key, value in zip(header, cols)}
result = PATTERN_PYTHON.match(release["Filename"])
result = PATTERN_FILENAME[distribution].match(release["Filename"])
if result:
timestamp = datetime.datetime.strptime(release["Last Modified"], "%Y-%m-%d %H:%M:%S")
if (now - timestamp).days > release_max_age_days:
continue
info = {
"python": result.group("python"),
"version": result.group("version"),
"os": result.group("os"),
"arch": result.group("arch"),
"download": "{base}{filename}".format(base=URL_MINICONDA, filename=release["Filename"])
"download": "{base}{filename}".format(base=base_url, filename=release["Filename"])
}
release.update(info)
timestamp = datetime.datetime.strptime(release["Last Modified"], "%Y-%m-%d %H:%M:%S")
if (now - timestamp).days > release_max_age_days:
continue
if release["os"] == "Linux" and release['arch'] == architecture and release["python"] == python_version:
if release["os"] == "Linux" and release['arch'] == architecture and release["python"] == str(python_version):
data[release["version"]] = release
# find actual latest version number
if len(data) == 0:
return data # nothing found
# find latest version number
if distribution == MINICONDA:
latest_item = [item for item in data.values() if item["version"] == "latest"]
latest_version = [item for item in data.values() if
item["MD5"] == latest_item[0]["MD5"] and item["version"] != "latest"]
latest_version_str = latest_version[0]["version"]
# update latest version number in map
data["latest"]["version"] = latest_version_str
elif distribution == ANACONDA:
sorted_versions = sorted(data.keys(), reverse=True)
latest_version = sorted_versions[0]
data["latest"] = data[latest_version]
return data
def parse_plugin_parameter(terms, position, default, allowed_terms):
result = default
if len(terms) > position and terms[position] in allowed_terms:
result = terms[position]
return result
class LookupModule(LookupBase):
def run(self, terms, variables=None, **kwargs):
return [json.dumps(fetch_miniconda_releases())]
conda_distribution = parse_plugin_parameter(terms, position=0, default=MINICONDA,
allowed_terms=[MINICONDA, ANACONDA])
python_version = parse_plugin_parameter(terms, position=1, default="3",
allowed_terms=["2", "3", 2, 3])
release_data = fetch_releases(distribution=conda_distribution, python_version=python_version)
# if len(release_data) == 0:
# raise AnsibleError("Failed to lookup conda releases for %s" % conda_distribution)
return [json.dumps(release_data)]
if __name__ == '__main__':
print(json.dumps(fetch_miniconda_releases(), indent=4))
print(json.dumps(fetch_releases(distribution=MINICONDA, python_version="3"), indent=4))
print(json.dumps(fetch_releases(distribution=ANACONDA, python_version="2"), indent=4))
......@@ -12,7 +12,7 @@
register: check_conda
- name: Lookup recent version of conda
set_fact:
conda_releases: "{{ lookup('conda_releases') }}"
conda_releases: "{{ lookup('conda_releases', 'miniconda') }}"
- name: Show conda releases
debug: msg="{{ conda_releases }}"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment