diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-25 22:23:05 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-25 22:23:05 +0300 |
| commit | 0b9cd40f79f543a3845ba45cc3514fa47d33cd1c (patch) | |
| tree | 5005c2dc6627c7c86d60a43fac29b3bae3308725 /lib/hyperstack/provisioning_orchestrator.rb | |
| parent | e95ec1dd2a631a5d8790cedbe770baa95f048d94 (diff) | |
Fix Gemma 4 vLLM startup and improve partial-provisioning UX
- provisioning.rb: auto-install pytest before pre_start_cmd to fix missing
dependency in nightly vLLM images that crashes EngineCore on cupy import
- cli.rb: relax active_config_loaders/vm1_alive? to match by vm_id+public_ip
instead of requiring status==ACTIVE, so watch/status/test work on VMs
that were interrupted mid-provisioning
- vm_lifecycle.rb: persist API status/vm_state back to state file during
status calls; add 'Provisioning: incomplete' notice when provisioned_at
is missing
- provisioning_orchestrator.rb: add wait_for_ssh polling before
ensure_trusted_host to fix race between SSH daemon readiness and keyscan
Diffstat (limited to 'lib/hyperstack/provisioning_orchestrator.rb')
| -rw-r--r-- | lib/hyperstack/provisioning_orchestrator.rb | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/hyperstack/provisioning_orchestrator.rb b/lib/hyperstack/provisioning_orchestrator.rb index 7dbb10e..b9f9e3d 100644 --- a/lib/hyperstack/provisioning_orchestrator.rb +++ b/lib/hyperstack/provisioning_orchestrator.rb @@ -29,6 +29,7 @@ module HyperstackVM state['security_rules'] = Array(vm['security_rules']).map { |r| normalize_rule(r) } @state_store.save(state) + wait_for_ssh(state['public_ip']) @ssh_runner.ensure_trusted_host(state['public_ip']) if @config.guest_bootstrap_enabled? && state['bootstrapped_at'].nil? @@ -78,6 +79,12 @@ module HyperstackVM state end + def wait_for_ssh(host) + with_polling("SSH on #{host}:#{@config.ssh_port} to become reachable", timeout: 300) do + @ssh_runner.tcp_open?(host, @config.ssh_port) + end + end + def wait_for_ready(vm_id) with_polling("VM #{vm_id} to become ready for firewall updates") do vm = @client.get_vm(vm_id) |
