ellf-cli 17.0.45__tar.gz → 17.0.51__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. {ellf_cli-17.0.45/ellf_cli.egg-info → ellf_cli-17.0.51}/PKG-INFO +1 -1
  2. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/about.json +1 -1
  3. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cluster_config.py +26 -4
  4. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/_helpers.py +39 -17
  5. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/provision.py +13 -3
  6. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/start.py +15 -3
  7. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/terraform.py +25 -9
  8. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf.json +1 -1
  9. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/helm.py +44 -8
  10. {ellf_cli-17.0.45 → ellf_cli-17.0.51/ellf_cli.egg-info}/PKG-INFO +1 -1
  11. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/LICENSE +0 -0
  12. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/MANIFEST.in +0 -0
  13. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/README.md +0 -0
  14. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/__init__.py +0 -0
  15. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/__main__.py +0 -0
  16. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/about.py +0 -0
  17. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/appdirs.py +0 -0
  18. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/auth.py +0 -0
  19. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cli.py +0 -0
  20. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cloud/__init__.py +0 -0
  21. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/cloud/gcp.py +0 -0
  22. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/__init__.py +0 -0
  23. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_cluster_select.py +0 -0
  24. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_org_select.py +0 -0
  25. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_recipe_file.py +0 -0
  26. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_recipe_subcommand.py +0 -0
  27. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/_state.py +0 -0
  28. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/actions.py +0 -0
  29. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/agents.py +0 -0
  30. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/assets.py +0 -0
  31. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/auth.py +0 -0
  32. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/clusters.py +0 -0
  33. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/config.py +0 -0
  34. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/datasets.py +0 -0
  35. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/__init__.py +0 -0
  36. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/cp.py +0 -0
  37. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/ls.py +0 -0
  38. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/rm.py +0 -0
  39. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/rsync.py +0 -0
  40. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/files/stats.py +0 -0
  41. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/general.py +0 -0
  42. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/import_export.py +0 -0
  43. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/__init__.py +0 -0
  44. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/deploy.py +0 -0
  45. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/init_values.py +0 -0
  46. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/register.py +0 -0
  47. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/setup.py +0 -0
  48. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/infra/tls.py +0 -0
  49. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/jobs.py +0 -0
  50. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/packages.py +0 -0
  51. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/paths.py +0 -0
  52. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/plans.py +0 -0
  53. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/projects.py +0 -0
  54. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/publish_code.py +0 -0
  55. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/publish_data.py +0 -0
  56. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/recipes.py +0 -0
  57. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/secrets.py +0 -0
  58. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/services.py +0 -0
  59. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/support.py +0 -0
  60. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/tasks.py +0 -0
  61. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/todos.py +0 -0
  62. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/commands/users.py +0 -0
  63. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/config.py +0 -0
  64. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/.claude-plugin/plugin.json +0 -0
  65. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/.gitignore +0 -0
  66. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skill_variants.json +0 -0
  67. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/SKILL.md +0 -0
  68. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/annotation_audit.md +0 -0
  69. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.assistant/references/builtin_ellf_annotation_recipes.md +0 -0
  70. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/SKILL.md +0 -0
  71. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/annotation_audit.md +0 -0
  72. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_ellf_annotation_recipes.md +0 -0
  73. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-annotate.coding/references/builtin_prodigy_recipes.md +0 -0
  74. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ask/SKILL.md +0 -0
  75. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-handoff/SKILL.md +0 -0
  76. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/SKILL.md +0 -0
  77. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/annotation_metrics.md +0 -0
  78. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.assistant/references/training_monitoring.md +0 -0
  79. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/SKILL.md +0 -0
  80. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/annotation_metrics.md +0 -0
  81. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/references/training_monitoring.md +0 -0
  82. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-monitor.coding/scripts/check_training.py +0 -0
  83. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.assistant/SKILL.md +0 -0
  84. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/SKILL.md +0 -0
  85. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/references/data_infra_cli.md +0 -0
  86. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-ops.coding/scripts/run_job.py +0 -0
  87. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-patterns/SKILL.md +0 -0
  88. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-patterns/references/pattern_strategies.md +0 -0
  89. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/SKILL.md +0 -0
  90. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_action_recipe.py +0 -0
  91. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_agent_recipe.py +0 -0
  92. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_blocks_ui.py +0 -0
  93. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_correct.py +0 -0
  94. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_custom_ui.py +0 -0
  95. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_manual.py +0 -0
  96. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_pages_ui.py +0 -0
  97. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_routing.py +0 -0
  98. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_task_recipe.py +0 -0
  99. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/assets/templates/template_teach.py +0 -0
  100. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/builtin_recipes.md +0 -0
  101. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/ellf_recipe_sdk.md +0 -0
  102. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/lint_recipe.py +0 -0
  103. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/prodigy_recipe_api.md +0 -0
  104. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-prodigy/references/template_index.md +0 -0
  105. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/SKILL.md +0 -0
  106. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/consulting_patterns.md +0 -0
  107. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/explosion_strategy.md +0 -0
  108. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.assistant/references/prodigy_llm_bot.md +0 -0
  109. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/SKILL.md +0 -0
  110. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/consulting_patterns.md +0 -0
  111. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/explosion_strategy.md +0 -0
  112. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-project.coding/references/prodigy_llm_bot.md +0 -0
  113. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.assistant/SKILL.md +0 -0
  114. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-support.coding/SKILL.md +0 -0
  115. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-todo/SKILL.md +0 -0
  116. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/SKILL.md +0 -0
  117. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/diagnostics.md +0 -0
  118. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/evaluation_guide.md +0 -0
  119. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/model_selection.md +0 -0
  120. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/training_paradigms.md +0 -0
  121. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.assistant/references/workflow.md +0 -0
  122. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/SKILL.md +0 -0
  123. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_advanced.md +0 -0
  124. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_architectures.md +0 -0
  125. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/config_training.md +0 -0
  126. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/diagnostics.md +0 -0
  127. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/evaluation_guide.md +0 -0
  128. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/experiment_patterns.md +0 -0
  129. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/model_selection.md +0 -0
  130. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_paradigms.md +0 -0
  131. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/training_troubleshooting.md +0 -0
  132. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/references/workflow.md +0 -0
  133. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ellf_skills/skills/ellf-train.coding/scripts/ellf_logger.py +0 -0
  134. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/errors.py +0 -0
  135. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/key_pair.py +0 -0
  136. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/main.py +0 -0
  137. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/messages.py +0 -0
  138. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/query.py +0 -0
  139. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/cookiecutter.json +0 -0
  140. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/.gitignore +0 -0
  141. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/README.md.tmpl +0 -0
  142. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements-dev.in +0 -0
  143. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/requirements.in +0 -0
  144. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/setup.py.tmpl +0 -0
  145. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/__init__.py +0 -0
  146. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/about.py +0 -0
  147. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/__init__.py +0 -0
  148. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/recipes_cookiecutter/{{cookiecutter.package_dir}}/{{cookiecutter.package_name}}/recipes/example_task.py +0 -0
  149. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/testing/__init__.py +0 -0
  150. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ty.py +0 -0
  151. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/ui.py +0 -0
  152. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/url.py +0 -0
  153. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli/util.py +0 -0
  154. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/SOURCES.txt +0 -0
  155. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/dependency_links.txt +0 -0
  156. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/entry_points.txt +0 -0
  157. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/not-zip-safe +0 -0
  158. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/requires.txt +0 -0
  159. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/ellf_cli.egg-info/top_level.txt +0 -0
  160. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/pyproject.toml +0 -0
  161. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/setup.cfg +0 -0
  162. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/setup.py +0 -0
  163. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_appdirs.py +0 -0
  164. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_auth.py +0 -0
  165. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_config.py +0 -0
  166. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_errors.py +0 -0
  167. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_files_cp.py +0 -0
  168. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_files_cp_helpers.py +0 -0
  169. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_info.py +0 -0
  170. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_invalid_secrets.py +0 -0
  171. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_key_pair.py +0 -0
  172. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_login.py +0 -0
  173. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_logout.py +0 -0
  174. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_main.py +0 -0
  175. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_org_select.py +0 -0
  176. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_plans.py +0 -0
  177. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_projects.py +0 -0
  178. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_publish_data.py +0 -0
  179. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_query.py +0 -0
  180. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_recipe_file.py +0 -0
  181. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_recipes.py +0 -0
  182. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_state.py +0 -0
  183. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_support.py +0 -0
  184. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ty.py +0 -0
  185. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ui.py +0 -0
  186. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_ui_extras.py +0 -0
  187. {ellf_cli-17.0.45 → ellf_cli-17.0.51}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 17.0.45
3
+ Version: 17.0.51
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "title": "Ellf CLI",
3
3
  "name": "ellf-cli",
4
- "version": "17.0.45",
4
+ "version": "17.0.51",
5
5
  "summary": "Ellf Command Line Interface",
6
6
  "uri": "https://prodi.gy",
7
7
  "prog": "ellf",
@@ -5,7 +5,7 @@ import tempfile
5
5
  from contextlib import contextmanager
6
6
  from typing import Annotated, Iterator
7
7
 
8
- from pydantic import BaseModel, Field
8
+ from pydantic import BaseModel, Field, model_validator
9
9
 
10
10
  from .helm import (
11
11
  HelmChartValues,
@@ -35,7 +35,8 @@ class ClusterConfig(BaseModel):
35
35
  workspace: str | None = None
36
36
 
37
37
  class Deployment(BaseModel):
38
- gcp: HelmChartValues.GCP
38
+ gcp: HelmChartValues.GCP | None = None
39
+ aws: HelmChartValues.AWS | None = None
39
40
  domain: str
40
41
  pam_domain: Annotated[str, Field(alias="pamDomain")] = ""
41
42
  container_registry: str = ""
@@ -53,9 +54,25 @@ class ClusterConfig(BaseModel):
53
54
  system_node_pool_size: int = 1
54
55
  model_config = {"populate_by_name": True}
55
56
 
57
+ @model_validator(mode="after")
58
+ def _check_exactly_one_cloud_provider(self) -> "ClusterConfig.Deployment":
59
+ if bool(self.gcp) == bool(self.aws):
60
+ raise ValueError(
61
+ "deployment must set exactly one of 'gcp' or 'aws', not"
62
+ f" {'both' if self.gcp else 'neither'}"
63
+ )
64
+ return self
65
+
66
+ @property
67
+ def cloud_provider(self) -> str:
68
+ return "gcp" if self.gcp else "aws"
69
+
56
70
  @property
57
71
  def region(self) -> str:
58
- return self.gcp.zone[:-2]
72
+ if self.gcp:
73
+ return self.gcp.zone[:-2]
74
+ assert self.aws
75
+ return self.aws.region
59
76
 
60
77
  name: str
61
78
  terraform: Terraform
@@ -84,6 +101,7 @@ class ClusterConfigOverrides(BaseModel):
84
101
 
85
102
  class Deployment(BaseModel):
86
103
  gcp: HelmChartValues.GCP | None = None
104
+ aws: HelmChartValues.AWS | None = None
87
105
  domain: str | None = None
88
106
  pam_domain: Annotated[str | None, Field(alias="pamDomain")] = None
89
107
  container_registry: str | None = None
@@ -103,7 +121,11 @@ class ClusterConfigOverrides(BaseModel):
103
121
 
104
122
  @property
105
123
  def region(self) -> str | None:
106
- return self.gcp.zone[:-2] if self.gcp else None
124
+ if self.gcp:
125
+ return self.gcp.zone[:-2]
126
+ if self.aws:
127
+ return self.aws.region
128
+ return None
107
129
 
108
130
  name: str | None = None
109
131
  terraform: Terraform | None = None
@@ -26,23 +26,45 @@ SYSTEM_NODE_TOLERATIONS = [
26
26
  ]
27
27
 
28
28
 
29
- def get_cluster_credentials(project: str, zone: str, cluster_name: str) -> None:
30
- """Run gcloud container clusters get-credentials to configure kubectl."""
31
- subprocess.run(
32
- [
33
- "gcloud",
34
- "container",
35
- "clusters",
36
- "get-credentials",
37
- cluster_name,
38
- "--zone",
39
- zone,
40
- "--project",
41
- project,
42
- ],
43
- check=True,
44
- text=True,
45
- )
29
+ def get_cluster_credentials(
30
+ cloud_provider: str,
31
+ cluster_name: str,
32
+ *,
33
+ project: str = "",
34
+ zone: str = "",
35
+ region: str = "",
36
+ ) -> None:
37
+ """Configure kubectl for the cluster via the provider's own credential command."""
38
+ if cloud_provider == "aws":
39
+ subprocess.run(
40
+ [
41
+ "aws",
42
+ "eks",
43
+ "update-kubeconfig",
44
+ "--region",
45
+ region,
46
+ "--name",
47
+ cluster_name,
48
+ ],
49
+ check=True,
50
+ text=True,
51
+ )
52
+ else:
53
+ subprocess.run(
54
+ [
55
+ "gcloud",
56
+ "container",
57
+ "clusters",
58
+ "get-credentials",
59
+ cluster_name,
60
+ "--zone",
61
+ zone,
62
+ "--project",
63
+ project,
64
+ ],
65
+ check=True,
66
+ text=True,
67
+ )
46
68
 
47
69
 
48
70
  def ensure_cluster_keypair(infra_secret_name: str, namespace: str = "ellf") -> str:
@@ -51,9 +51,19 @@ def provision(
51
51
  cluster_name = config.deployment.cluster_name
52
52
  assert cluster_name, "cluster_name must be set in deployment config"
53
53
  auth = get_auth_state()
54
- get_cluster_credentials(
55
- config.deployment.gcp.project, config.deployment.gcp.zone, cluster_name
56
- )
54
+ if config.deployment.cloud_provider == "aws":
55
+ assert config.deployment.aws
56
+ get_cluster_credentials(
57
+ "aws", cluster_name, region=config.deployment.aws.region
58
+ )
59
+ else:
60
+ assert config.deployment.gcp
61
+ get_cluster_credentials(
62
+ "gcp",
63
+ cluster_name,
64
+ project=config.deployment.gcp.project,
65
+ zone=config.deployment.gcp.zone,
66
+ )
57
67
  ensure_cluster_keypair(config.deployment.infra_secret_name)
58
68
  cluster_auth = get_cluster_auth(auth.client, config.deployment.domain)
59
69
  values = build_values(config, cluster_auth)
@@ -56,9 +56,20 @@ def start(
56
56
  config = ClusterConfig(**config_dict)
57
57
  cluster_name = config.deployment.cluster_name
58
58
  assert cluster_name, "cluster_name must be set in deployment config"
59
- get_cluster_credentials(
60
- config.deployment.gcp.project, config.deployment.gcp.zone, cluster_name
61
- )
59
+ cloud_provider = config.deployment.cloud_provider
60
+ if cloud_provider == "aws":
61
+ assert config.deployment.aws
62
+ get_cluster_credentials(
63
+ "aws", cluster_name, region=config.deployment.aws.region
64
+ )
65
+ else:
66
+ assert config.deployment.gcp
67
+ get_cluster_credentials(
68
+ "gcp",
69
+ cluster_name,
70
+ project=config.deployment.gcp.project,
71
+ zone=config.deployment.gcp.zone,
72
+ )
62
73
  public_key = ensure_cluster_keypair(config.deployment.infra_secret_name)
63
74
  if offline is not None:
64
75
  from ellf_pam_sdk.models import ClusterCredentials, Image, Secrets
@@ -86,6 +97,7 @@ def start(
86
97
  auth.org_id,
87
98
  config.deployment.domain,
88
99
  public_key,
100
+ cloud_provider=cloud_provider,
89
101
  )
90
102
  cluster_auth = get_cluster_auth(auth.client, config.deployment.domain)
91
103
  values = build_values(config, cluster_auth)
@@ -116,7 +116,7 @@ def apply_terraform(
116
116
  if config_key is not None:
117
117
  config_dict = config_dict[config_key]
118
118
  config = ClusterConfig(**config_dict)
119
- tf_dir = src / "gcp"
119
+ tf_dir = src / config.deployment.cloud_provider
120
120
  if yes_tf_init:
121
121
  _terraform_init(config, tf_dir)
122
122
  if yes_tf_init or yes_tf_apply:
@@ -185,15 +185,31 @@ def _terraform_init(config: ClusterConfig, path: Path) -> None:
185
185
  @contextmanager
186
186
  def _write_terraform_vars(config: ClusterConfig) -> Iterator[str]:
187
187
  """Write terraform variables to a temp file, yielding its path."""
188
- data = {
189
- "gcp_project": config.deployment.gcp.project,
190
- "gcp_zone": config.deployment.gcp.zone,
191
- "domain": config.deployment.domain,
192
- "enable_ssh": True,
193
- "system_node_pool_machine_type": config.deployment.system_node_pool_machine_type,
194
- "system_node_pool_size": str(config.deployment.system_node_pool_size),
195
- "worker_types": {w.name: w.to_terraform_var() for w in config.node_pools},
188
+ cloud_provider = config.deployment.cloud_provider
189
+ worker_types = {
190
+ w.name: w.to_terraform_var(cloud_provider) for w in config.node_pools
196
191
  }
192
+ if cloud_provider == "aws":
193
+ assert config.deployment.aws
194
+ data = {
195
+ "aws_region": config.deployment.aws.region,
196
+ "domain": config.deployment.domain,
197
+ "enable_ssh": True,
198
+ "system_node_pool_instance_type": config.deployment.system_node_pool_machine_type,
199
+ "system_node_pool_size": str(config.deployment.system_node_pool_size),
200
+ "worker_types": worker_types,
201
+ }
202
+ else:
203
+ assert config.deployment.gcp
204
+ data = {
205
+ "gcp_project": config.deployment.gcp.project,
206
+ "gcp_zone": config.deployment.gcp.zone,
207
+ "domain": config.deployment.domain,
208
+ "enable_ssh": True,
209
+ "system_node_pool_machine_type": config.deployment.system_node_pool_machine_type,
210
+ "system_node_pool_size": str(config.deployment.system_node_pool_size),
211
+ "worker_types": worker_types,
212
+ }
197
213
  with tempfile.NamedTemporaryFile(
198
214
  mode="w", suffix=".tfvars.json", delete=True
199
215
  ) as tmp:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "prog": "ellf",
3
3
  "help": "Ellf Command Line Interface.",
4
- "version": "17.0.44",
4
+ "version": "17.0.50",
5
5
  "extra_key": "_extra",
6
6
  "commands": {
7
7
  "actions": {
@@ -66,6 +66,9 @@ class NodePool(BaseModel):
66
66
  preemptible: bool = False
67
67
  spot: bool = False
68
68
 
69
+ class AWSConfig(BaseModel):
70
+ spot: bool = False
71
+
69
72
  name: str
70
73
  node_class: str
71
74
  machine_type: str
@@ -74,6 +77,7 @@ class NodePool(BaseModel):
74
77
  max_size: int | None = None
75
78
  gpu: GPU | None = None
76
79
  gcp: GCPConfig = Field(default_factory=GCPConfig)
80
+ aws: AWSConfig = Field(default_factory=AWSConfig)
77
81
  per_job: PerJob
78
82
 
79
83
  @property
@@ -92,18 +96,39 @@ class NodePool(BaseModel):
92
96
  per_job=self.per_job,
93
97
  )
94
98
 
95
- def to_terraform_var(self) -> dict:
96
- """Convert to a terraform worker_types variable entry."""
99
+ def _min_max_size(self) -> tuple[int, int]:
100
+ min_size = self.min_size if self.min_size is not None else 0
101
+ max_size = (
102
+ self.max_size if self.max_size is not None else max(self.target_size, 1)
103
+ )
104
+ return min_size, max_size
105
+
106
+ def to_terraform_var(self, cloud_provider: str) -> dict:
107
+ """Convert to a terraform worker_types variable entry.
108
+
109
+ The two workspaces' `worker_types` variable shapes differ (AWS has no
110
+ separate preemptible/spot distinction and calls the GPU key `gpu`
111
+ rather than `guest_accelerator`), so the emitted dict is provider-specific.
112
+ """
113
+ min_size, max_size = self._min_max_size()
114
+ if cloud_provider == "aws":
115
+ return {
116
+ "name": self.name,
117
+ "node_class": self.node_class,
118
+ "instance_type": self.machine_type,
119
+ "spot": self.aws.spot,
120
+ "min_size": min_size,
121
+ "max_size": max_size,
122
+ "gpu": self.gpu.model_dump() if self.gpu else None,
123
+ }
97
124
  return {
98
125
  "name": self.name,
99
126
  "node_class": self.node_class,
100
127
  "machine_type": self.machine_type,
101
128
  "preemptible": self.preemptible,
102
129
  "spot": self.spot,
103
- "min_size": self.min_size if self.min_size is not None else 0,
104
- "max_size": self.max_size
105
- if self.max_size is not None
106
- else max(self.target_size, 1),
130
+ "min_size": min_size,
131
+ "max_size": max_size,
107
132
  "guest_accelerator": self.gpu.model_dump() if self.gpu else None,
108
133
  }
109
134
 
@@ -204,6 +229,9 @@ class HelmChartValues(BaseModel):
204
229
  project: str
205
230
  zone: str
206
231
 
232
+ class AWS(BaseModel):
233
+ region: str
234
+
207
235
  class ConfigFile(BaseModel):
208
236
  cluster_config: Annotated[str, Field(alias="clusterConfig")]
209
237
  cpl_config: Annotated[str, Field(alias="cplConfig")]
@@ -285,6 +313,7 @@ class HelmChartValues(BaseModel):
285
313
  service: Service
286
314
  postgresql: Postgresql
287
315
  gcp: GCP | None = None
316
+ aws: AWS | None = None
288
317
  automount_service_account_token: Annotated[
289
318
  bool | None, Field(alias="automountServiceAccountToken")
290
319
  ]
@@ -412,6 +441,9 @@ class HelmChartOverrides(BaseModel):
412
441
  project: str | None = None
413
442
  zone: str | None = None
414
443
 
444
+ class AWS(BaseModel):
445
+ region: str | None = None
446
+
415
447
  class ConfigFile(BaseModel):
416
448
  cluster_config: Annotated[str | None, Field(alias="clusterConfig")] = None
417
449
  cpl_config: Annotated[str | None, Field(alias="cplConfig")] = None
@@ -510,6 +542,7 @@ class HelmChartOverrides(BaseModel):
510
542
  service: Service | None = None
511
543
  postgresql: Postgresql | None = None
512
544
  gcp: GCP | None = None
545
+ aws: AWS | None = None
513
546
  automount_service_account_token: Annotated[
514
547
  bool | None, Field(alias="automountServiceAccountToken")
515
548
  ] = None
@@ -651,14 +684,17 @@ def build_values(
651
684
  infra_secret_name=config.deployment.infra_secret_name,
652
685
  ),
653
686
  gcp=HelmChartOverrides.GCP(**config.deployment.gcp.model_dump())
654
- if config.deployment.gcp.project
687
+ if config.deployment.gcp and config.deployment.gcp.project
688
+ else None,
689
+ aws=HelmChartOverrides.AWS(**config.deployment.aws.model_dump())
690
+ if config.deployment.aws
655
691
  else None,
656
692
  service_account=HelmChartOverrides.ServiceAccount(
657
693
  annotations={
658
694
  "iam.gke.io/gcp-service-account": f"cluster-gke-sa@{config.deployment.gcp.project}.iam.gserviceaccount.com",
659
695
  },
660
696
  )
661
- if config.deployment.gcp.project
697
+ if config.deployment.gcp and config.deployment.gcp.project
662
698
  else None,
663
699
  ingress=HelmChartOverrides.Ingress(
664
700
  tls=HelmChartOverrides.Ingress.TLS(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ellf-cli
3
- Version: 17.0.45
3
+ Version: 17.0.51
4
4
  Summary: Ellf Command Line Interface
5
5
  Home-page: https://prodi.gy
6
6
  Author: ExplosionAI GmbH
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes