test_user_data_template.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. from gpustack.cloud_providers.user_data import UserDataTemplate, ManufacturerEnum
  2. import yaml
  3. def test_userdata_template_basic():
  4. template = UserDataTemplate(
  5. server_url="http://test-server",
  6. token="test-token",
  7. image_name="gpustack/test:latest",
  8. worker_name="test-worker",
  9. )
  10. template.distribution = "ubuntu"
  11. template.install_driver = ManufacturerEnum.NVIDIA
  12. template.setup_driver = ManufacturerEnum.NVIDIA
  13. result = template.format()
  14. assert result.startswith("#cloud-config\n")
  15. data = yaml.safe_load(result)
  16. assert data["write_files"]
  17. assert any(
  18. f["path"] == "/var/lib/gpustack/config.yaml" for f in data["write_files"]
  19. )
  20. assert any(f["path"] == "/opt/gpustack-run-worker.sh" for f in data["write_files"])
  21. assert "runcmd" in data
  22. assert "systemctl enable post-reboot.service" in data["runcmd"]
  23. assert "packages" in data
  24. assert "docker.io" in data["packages"]
  25. assert "power_state" in data
  26. assert data["power_state"]["mode"] == "reboot"
  27. def test_userdata_template_no_driver():
  28. template = UserDataTemplate(
  29. server_url="http://test-server",
  30. token="test-token",
  31. image_name="gpustack/test:latest",
  32. worker_name="test-worker",
  33. )
  34. template.distribution = "ubuntu"
  35. template.install_driver = None
  36. template.setup_driver = None
  37. result = template.format()
  38. data = yaml.safe_load(result)
  39. assert "power_state" not in data
  40. assert "/opt/gpustack-run-worker.sh" in data["runcmd"]
  41. def test_userdata_template_debian():
  42. template = UserDataTemplate(
  43. server_url="http://test-server",
  44. token="test-token",
  45. image_name="gpustack/test:latest",
  46. worker_name="test-worker",
  47. )
  48. template.distribution = "debian"
  49. template.install_driver = ManufacturerEnum.NVIDIA
  50. template.setup_driver = ManufacturerEnum.NVIDIA
  51. result = template.format()
  52. data = yaml.safe_load(result)
  53. assert "docker.io" in data["packages"]
  54. assert any("dkms" in pkg for pkg in data["packages"])
  55. assert any("build-essential" in pkg for pkg in data["packages"])
  56. assert "runcmd" in data
  57. assert any("nvidia-ctk runtime configure" in cmd for cmd in data["runcmd"])
  58. def test_userdata_template_env_in_worker_script():
  59. template = UserDataTemplate(
  60. server_url="http://test-server",
  61. token="test-token",
  62. image_name="gpustack/test:latest",
  63. worker_name="test-worker",
  64. )
  65. template.distribution = "ubuntu"
  66. result = template.format()
  67. data = yaml.safe_load(result)
  68. worker_script_file = next(
  69. f for f in data["write_files"] if f["path"] == "/opt/gpustack-run-worker.sh"
  70. )
  71. assert (
  72. "--config-file=/var/lib/gpustack/config.yaml" in worker_script_file["content"]
  73. )
  74. def test_userdata_template_setup_driver():
  75. template = UserDataTemplate(
  76. server_url="http://test-server",
  77. token="test-token",
  78. image_name="gpustack/test:latest",
  79. worker_name="test-worker",
  80. )
  81. template.distribution = "ubuntu"
  82. template.setup_driver = ManufacturerEnum.NVIDIA
  83. result = template.format()
  84. data = yaml.safe_load(result)
  85. assert any("nvidia-ctk runtime configure" in cmd for cmd in data["runcmd"])
  86. def test_userdata_template_secret_configs():
  87. template = UserDataTemplate(
  88. server_url="http://test-server",
  89. token="test-token",
  90. image_name="gpustack/test:latest",
  91. worker_name="test-worker",
  92. secret_configs={
  93. "SECRET_KEY": "mysecret",
  94. "OPTIONAL_KEY": None,
  95. "ANOTHER_KEY": 123,
  96. },
  97. )
  98. template.distribution = "ubuntu"
  99. result = template.format()
  100. data = yaml.safe_load(result)
  101. config_file = next(
  102. f for f in data["write_files"] if f["path"] == "/var/lib/gpustack/config.yaml"
  103. )
  104. content = config_file["content"]
  105. # SECRET_KEY and ANOTHER_KEY should appear, OPTIONAL_KEY should not
  106. assert "SECRET_KEY: mysecret" in content
  107. assert "ANOTHER_KEY: 123" in content
  108. assert "OPTIONAL_KEY" not in content