Commit a7eb1fad authored by Reimar Stier's avatar Reimar Stier

Support to install anaconda

parent cabbba7e
--- ---
# defaults file for conda_installer # defaults file for conda_installer
\ No newline at end of file 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 ...@@ -7,15 +7,26 @@ from ansible.module_utils.urls import open_url
from ansible.plugins.lookup import LookupBase from ansible.plugins.lookup import LookupBase
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
URL_ANACONDA = "https://repo.anaconda.com/archive/" MINICONDA = "miniconda"
URL_MINICONDA = "https://repo.continuum.io/miniconda/" ANACONDA = "anaconda"
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+") 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 RELEASE_MAX_AGE_DAYS = 365
def fetch_miniconda_releases(architecture="x86_64", python_version="3", release_max_age_days=RELEASE_MAX_AGE_DAYS): def fetch_releases(distribution=MINICONDA, architecture="x86_64", python_version="3",
request = open_url(url=URL_MINICONDA, method="GET") release_max_age_days=RELEASE_MAX_AGE_DAYS):
base_url = BASE_URL[distribution]
request = open_url(url=base_url, method="GET")
response = request.read() response = request.read()
data = {} data = {}
...@@ -29,37 +40,61 @@ def fetch_miniconda_releases(architecture="x86_64", python_version="3", release_ ...@@ -29,37 +40,61 @@ def fetch_miniconda_releases(architecture="x86_64", python_version="3", release_
cols = row.find_all('td') cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols] cols = [ele.text.strip() for ele in cols]
release = {key: value for key, value in zip(header, 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: 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 = { info = {
"python": result.group("python"), "python": result.group("python"),
"version": result.group("version"), "version": result.group("version"),
"os": result.group("os"), "os": result.group("os"),
"arch": result.group("arch"), "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) release.update(info)
timestamp = datetime.datetime.strptime(release["Last Modified"], "%Y-%m-%d %H:%M:%S") if release["os"] == "Linux" and release['arch'] == architecture and release["python"] == str(python_version):
if (now - timestamp).days > release_max_age_days:
continue
if release["os"] == "Linux" and release['arch'] == architecture and release["python"] == python_version:
data[release["version"]] = release data[release["version"]] = release
# find actual latest version number if len(data) == 0:
latest_item = [item for item in data.values() if item["version"] == "latest"] return data # nothing found
latest_version = [item for item in data.values() if
item["MD5"] == latest_item[0]["MD5"] and item["version"] != "latest"] # find latest version number
latest_version_str = latest_version[0]["version"] if distribution == MINICONDA:
# update latest version number in map latest_item = [item for item in data.values() if item["version"] == "latest"]
data["latest"]["version"] = latest_version_str 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 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): class LookupModule(LookupBase):
def run(self, terms, variables=None, **kwargs): 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__': 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 @@ ...@@ -12,7 +12,7 @@
register: check_conda register: check_conda
- name: Lookup recent version of conda - name: Lookup recent version of conda
set_fact: set_fact:
conda_releases: "{{ lookup('conda_releases') }}" conda_releases: "{{ lookup('conda_releases', 'miniconda') }}"
- name: Show conda releases - name: Show conda releases
debug: msg="{{ 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