From 69806e0a4664108ab7f811f3a6387e64c0b9a23f Mon Sep 17 00:00:00 2001
From: muzi502 <42566386+muzi502@users.noreply.github.com>
Date: Mon, 26 Apr 2021 14:47:01 +0800
Subject: [PATCH] Add nerdctl cli tool for containerd user (#7500)

* Add nerdctl cli tool for containerd user

* Add nerdctl enable option

* Add nerdctl enable option and update nerdctl version to 0.8.0
---
 .../nerdctl/handlers/main.yml                 | 12 ++++++++++
 roles/container-engine/nerdctl/tasks/main.yml | 15 ++++++++++++
 roles/download/defaults/main.yml              | 24 +++++++++++++++++++
 roles/download/tasks/main.yml                 |  8 +++++++
 roles/kubespray-defaults/defaults/main.yaml   |  3 +++
 roles/reset/tasks/main.yml                    |  2 ++
 6 files changed, 64 insertions(+)
 create mode 100644 roles/container-engine/nerdctl/handlers/main.yml
 create mode 100644 roles/container-engine/nerdctl/tasks/main.yml

diff --git a/roles/container-engine/nerdctl/handlers/main.yml b/roles/container-engine/nerdctl/handlers/main.yml
new file mode 100644
index 000000000..27895ff74
--- /dev/null
+++ b/roles/container-engine/nerdctl/handlers/main.yml
@@ -0,0 +1,12 @@
+---
+- name: Get nerdctl completion
+  command: "{{ bin_dir }}/nerdctl completion bash"
+  changed_when: False
+  register: nerdctl_completion
+  check_mode: false
+
+- name: Install nerdctl completion
+  copy:
+    dest: /etc/bash_completion.d/nerdctl
+    content: "{{ nerdctl_completion.stdout }}"
+    mode: 0644
diff --git a/roles/container-engine/nerdctl/tasks/main.yml b/roles/container-engine/nerdctl/tasks/main.yml
new file mode 100644
index 000000000..4afddafaf
--- /dev/null
+++ b/roles/container-engine/nerdctl/tasks/main.yml
@@ -0,0 +1,15 @@
+---
+- name: nerdctl | Download nerdctl
+  include_tasks: "../../../download/tasks/download_file.yml"
+  vars:
+    download: "{{ download_defaults | combine(downloads.nerdctl) }}"
+
+- name: nerdctl | Copy nerdctl binary from download dir
+  copy:
+    src: "{{ local_release_dir }}/nerdctl"
+    dest: "{{ bin_dir }}/nerdctl"
+    mode: 0755
+    remote_src: true
+  notify:
+    - Get nerdctl completion
+    - Install nerdctl completion
diff --git a/roles/download/defaults/main.yml b/roles/download/defaults/main.yml
index d9dedf5ea..99d080bb5 100644
--- a/roles/download/defaults/main.yml
+++ b/roles/download/defaults/main.yml
@@ -84,6 +84,7 @@ multus_version: "v3.7"
 ovn4nfv_ovn_image_version: "v1.0.0"
 ovn4nfv_k8s_plugin_image_version: "v1.1.0"
 helm_version: "v3.5.4"
+nerdctl_version: "0.8.0"
 
 # Get kubernetes major version (i.e. 1.17.4 => 1.17)
 kube_major_version: "{{ kube_version | regex_replace('^v([0-9])+\\.([0-9]+)\\.[0-9]+', 'v\\1.\\2') }}"
@@ -105,6 +106,7 @@ crictl_download_url: "https://github.com/kubernetes-sigs/cri-tools/releases/down
 helm_download_url: "https://get.helm.sh/helm-{{ helm_version }}-linux-{{ image_arch }}.tar.gz"
 crun_download_url: "https://github.com/containers/crun/releases/download/{{ crun_version }}/crun-{{ crun_version }}-linux-{{ image_arch }}"
 kata_containers_download_url: "https://github.com/kata-containers/runtime/releases/download/{{ kata_containers_version }}/kata-static-{{ kata_containers_version }}-{{ ansible_architecture }}.tar.xz"
+nerdctl_download_url: "https://github.com/containerd/nerdctl/releases/download/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
 
 crictl_checksums:
   arm:
@@ -366,6 +368,14 @@ kata_containers_binary_checksums:
     1.11.3: 0
     1.12.1: 0
 
+nerdctl_archive_checksums:
+  arm:
+    0.8.0: 4f010fad22de10c839c003f126e9a10971abd142a9666bd1d3f2f49a3b545b5a
+  arm64:
+    0.8.0: 55073069e72315b58b4ebedb49c48f7d762cae02c541cbb36693223ae4019a6b
+  amd64:
+    0.8.0: a8097ad1f302c4ee2643162569a8f7019190461e740e453f41dba3ba264d0d3d
+
 etcd_binary_checksum: "{{ etcd_binary_checksums[image_arch] }}"
 cni_binary_checksum: "{{ cni_binary_checksums[image_arch] }}"
 kubelet_binary_checksum: "{{ kubelet_checksums[image_arch][kube_version] }}"
@@ -377,6 +387,7 @@ crictl_binary_checksum: "{{ crictl_checksums[image_arch][crictl_version] }}"
 helm_archive_checksum: "{{ helm_archive_checksums[image_arch][helm_version] }}"
 crun_binary_checksum: "{{ crun_checksums[image_arch][crun_version] }}"
 kata_containers_binary_checksum: "{{ kata_containers_binary_checksums[image_arch][kata_containers_version] }}"
+nerdctl_archive_checksum: "{{ nerdctl_archive_checksums[image_arch][nerdctl_version] }}"
 
 # Containers
 # In some cases, we need a way to set --registry-mirror or --insecure-registry for docker,
@@ -657,6 +668,19 @@ downloads:
     groups:
     - k8s-cluster
 
+  nerdctl:
+    file: true
+    enabled: "{{ nerdctl_enabled }}"
+    version: "{{ nerdctl_version }}"
+    dest: "{{ local_release_dir }}/nerdctl-{{ nerdctl_version }}-linux-{{ image_arch }}.tar.gz"
+    sha256: "{{ nerdctl_archive_checksum }}"
+    url: "{{ nerdctl_download_url }}"
+    unarchive: true
+    owner: "root"
+    mode: "0755"
+    groups:
+    - k8s-cluster
+
   cilium:
     enabled: "{{ kube_network_plugin == 'cilium' or cilium_deploy_additionally | default(false) | bool }}"
     container: true
diff --git a/roles/download/tasks/main.yml b/roles/download/tasks/main.yml
index e20945af3..48b592050 100644
--- a/roles/download/tasks/main.yml
+++ b/roles/download/tasks/main.yml
@@ -14,6 +14,14 @@
     - not skip_downloads|default(false)
     - container_manager in ['containerd', 'crio']
 
+- name: install nerdctl
+  import_role:
+    name: container-engine/nerdctl
+  when:
+    - not skip_downloads|default(false)
+    - container_manager in ['containerd']
+    - nerdctl_enabled
+
 - name: download | Get kubeadm binary and list of required images
   include_tasks: prep_kubeadm_images.yml
   when:
diff --git a/roles/kubespray-defaults/defaults/main.yaml b/roles/kubespray-defaults/defaults/main.yaml
index 13f8c773b..6ca0b9844 100644
--- a/roles/kubespray-defaults/defaults/main.yaml
+++ b/roles/kubespray-defaults/defaults/main.yaml
@@ -361,6 +361,9 @@ cert_manager_enabled: false
 expand_persistent_volumes: false
 metallb_enabled: false
 
+# containerd official CLI tool
+nerdctl_enabled: false
+
 ## When OpenStack is used, Cinder version can be explicitly specified if autodetection fails (Fixed in 1.9: https://github.com/kubernetes/kubernetes/issues/50461)
 # openstack_blockstorage_version: "v1/v2/auto (default)"
 openstack_blockstorage_ignore_volume_az: "{{ volume_cross_zone_attachment | default('false') }}"
diff --git a/roles/reset/tasks/main.yml b/roles/reset/tasks/main.yml
index 6370f01ef..d216cd5ce 100644
--- a/roles/reset/tasks/main.yml
+++ b/roles/reset/tasks/main.yml
@@ -287,6 +287,7 @@
     - "{{ bin_dir }}/calico-upgrade"
     - "{{ bin_dir }}/weave"
     - "{{ bin_dir }}/crictl"
+    - "{{ bin_dir }}/nerdctl"
     - "{{ bin_dir }}/netctl"
     - "{{ bin_dir }}/k8s-certs-renew.sh"
     - /var/lib/cni
@@ -298,6 +299,7 @@
     - /run/calico
     - /etc/bash_completion.d/kubectl.sh
     - /etc/bash_completion.d/crictl
+    - /etc/bash_completion.d/nerdctl
   ignore_errors: yes
   tags:
     - files
-- 
GitLab