Skip to content

Commit

Permalink
implement download mirrors support (kubernetes-sigs#8474)
Browse files Browse the repository at this point in the history
* [download] add mechanism to support mirrors

* [calico] support alternate download url
  • Loading branch information
cristicalin authored and LuckySB committed Oct 21, 2023
1 parent 2899d1e commit d431c89
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
4 changes: 4 additions & 0 deletions roles/download/defaults/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ etcd_download_url: "https://github.com/etcd-io/etcd/releases/download/{{ etcd_ve
flannel_cni_download_url: "https://github.com/flannel-io/cni-plugin/releases/download/{{ flannel_cni_version }}/flannel-{{ image_arch }}"
cni_download_url: "https://github.com/containernetworking/plugins/releases/download/{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
calicoctl_download_url: "https://github.com/projectcalico/calicoctl/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
calicoctl_alternate_download_url: "https://github.com/projectcalico/calico/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
calico_crds_download_url: "https://github.com/projectcalico/calico/archive/{{ calico_version }}.tar.gz"
crictl_download_url: "https://github.com/kubernetes-sigs/cri-tools/releases/download/{{ crictl_version }}/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
helm_download_url: "https://get.helm.sh/helm-{{ helm_version }}-linux-{{ image_arch }}.tar.gz"
Expand Down Expand Up @@ -1163,6 +1164,9 @@ downloads:
dest: "{{ local_release_dir }}/calicoctl"
sha256: "{{ calicoctl_binary_checksum }}"
url: "{{ calicoctl_download_url }}"
mirrors:
- "{{ calicoctl_alternate_download_url }}"
- "{{ calicoctl_download_url }}"
unarchive: false
owner: "root"
mode: "0755"
Expand Down
31 changes: 30 additions & 1 deletion roles/download/tasks/download_file.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,40 @@
- download_force_cache
- not download_localhost

# We check a number of mirrors that may hold the file and pick a working one at random
# This task will avoid logging it's parameters to not leak environment passwords in the log
- name: download_file | Validate mirrors
uri:
url: "{{ mirror }}"
method: HEAD
validate_certs: "{{ download_validate_certs }}"
url_username: "{{ download.username | default(omit) }}"
url_password: "{{ download.password | default(omit) }}"
force_basic_auth: "{{ download.force_basic_auth | default(omit) }}"
delegate_to: "{{ download_delegate if download_force_cache else inventory_hostname }}"
run_once: "{{ download_force_cache }}"
register: uri_result
until: uri_result is success
retries: 4
delay: "{{ retry_stagger | default(5) }}"
environment: "{{ proxy_env }}"
no_log: true
loop: "{{ download.mirrors | default([download.url]) }}"
loop_control:
loop_var: mirror
ignore_errors: true

# Ansible 2.9 requires we convert a generator to a list
- name: download_file | Get the list of working mirrors
set_fact:
valid_mirror_urls: "{{ uri_result.results | selectattr('failed', 'eq', False) | map(attribute='mirror') | list }}"
delegate_to: "{{ download_delegate if download_force_cache else inventory_hostname }}"

# This must always be called, to check if the checksum matches. On no-match the file is re-downloaded.
# This task will avoid logging it's parameters to not leak environment passwords in the log
- name: download_file | Download item
get_url:
url: "{{ download.url }}"
url: "{{ valid_mirror_urls | random }}"
dest: "{{ file_path_cached if download_force_cache else download.dest }}"
owner: "{{ omit if download_localhost else (download.owner | default(omit)) }}"
mode: "{{ omit if download_localhost else (download.mode | default(omit)) }}"
Expand Down

0 comments on commit d431c89

Please sign in to comment.