k3s.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import os
  2. import hashlib
  3. from lib import consts
  4. from lib.cmd import run_cmd
  5. from lib.ssh import StderrException
  6. def GET_AIRGAP_DIR():
  7. default_dir = os.path.join(os.getcwd(), "airgap_assets")
  8. if os.environ.get('K3S_AIRGAP_DIR', None):
  9. return os.environ.get('K3S_AIRGAP_DIR')
  10. return default_dir
  11. VERSION_V1_28_5_K3S_1 = "v1.28.5+k3s1"
  12. '''
  13. from:
  14. - https://github.com/k3s-io/k3s/releases/download/v1.29.0%2Bk3s1/sha256sum-amd64.txt
  15. - https://github.com/k3s-io/k3s/releases/download/v1.29.0%2Bk3s1/sha256sum-arm64.txt
  16. '''
  17. SHA256_CHECK_SUM = {
  18. VERSION_V1_28_5_K3S_1: {
  19. 'k3s': '38fadb2baf75cb516d59f7f4a40c1950fdc0dce5ebe7251aae235527b7de4083',
  20. 'k3s-airgap-images-amd64.tar.zst': 'e259a812e77219f8436938d7ee871945549956defe12bd210ca206597198cd67',
  21. 'k3s-arm64': 'ce46081904d461175f152493814d2f2ac1d5e40992d6b2b2b819eb6532c413f9',
  22. 'k3s-airgap-images-arm64.tar.zst': '896a80cdfa8131efba625775c60c79a5525ef22b6d5a6c87560afed50b8a630b'
  23. }
  24. }
  25. def cal_file_sha256(filename):
  26. sha256_hash = hashlib.sha256()
  27. with open(filename,"rb") as f:
  28. # Read and update hash string value in blocks of 4K
  29. for byte_block in iter(lambda: f.read(4096),b""):
  30. sha256_hash.update(byte_block)
  31. return sha256_hash.hexdigest()
  32. def download_asset(dest_dir, k3s_version, asset_url):
  33. asset_name = os.path.basename(asset_url)
  34. target_path = os.path.join(dest_dir, asset_name)
  35. expect_checksum = SHA256_CHECK_SUM[k3s_version][asset_name]
  36. if os.path.exists(target_path):
  37. exists_checksum = cal_file_sha256(target_path)
  38. if exists_checksum == expect_checksum:
  39. print(f"{target_path} already exists, skip download.")
  40. return
  41. else:
  42. print(f"{target_path}'s sha256 checksum {exists_checksum} != {expect_checksum}, redownload it.")
  43. run_cmd(f'curl -L {asset_url} > {target_path}', no_strip=True, realtime_output=True)
  44. NO_SUCH_FILE_OR_DIR_ERR = [
  45. 'No such file or directory',
  46. '没有那个文件或目录',
  47. ]
  48. def is_using_k3s(ssh_client=None, use_sudo=False):
  49. if ssh_client is None:
  50. if os.environ.get(consts.ENV_K8S_V115) == consts.ENV_VAL_TRUE:
  51. return False
  52. return True
  53. else:
  54. try:
  55. kubelet_config = '/etc/kubernetes/kubelet.conf'
  56. ret = ssh_client.exec_command(f'ls -alh {kubelet_config}', use_sudo)
  57. if kubelet_config in ret:
  58. return False
  59. return True
  60. except StderrException as e:
  61. for err in NO_SUCH_FILE_OR_DIR_ERR:
  62. if err in str(e):
  63. return True
  64. raise e
  65. except Exception as e:
  66. raise e
  67. def init_airgap_assets(dest_dir, k3s_version):
  68. # usage: K3S_URL_PREFIX=http://LOCAL_k3s_host_url
  69. # in order to speed up testing.
  70. if not is_using_k3s():
  71. return
  72. K3S_URL_PREFIX = os.environ.get('K3S_URL_PREFIX', 'https://github.com/k3s-io/k3s/releases/download/v1.28.5%2Bk3s1')
  73. if not os.path.exists(dest_dir):
  74. os.makedirs(dest_dir)
  75. download_asset(dest_dir, k3s_version, f'{K3S_URL_PREFIX}/k3s')
  76. download_asset(dest_dir, k3s_version, f'{K3S_URL_PREFIX}/k3s-arm64')
  77. download_asset(dest_dir, k3s_version, f'{K3S_URL_PREFIX}/k3s-airgap-images-arm64.tar.zst')
  78. download_asset(dest_dir, k3s_version, f'{K3S_URL_PREFIX}/k3s-airgap-images-amd64.tar.zst')