From 0b9cd40f79f543a3845ba45cc3514fa47d33cd1c Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Mon, 25 May 2026 22:23:05 +0300 Subject: 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 --- lib/hyperstack/vm_lifecycle.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/hyperstack/vm_lifecycle.rb') diff --git a/lib/hyperstack/vm_lifecycle.rb b/lib/hyperstack/vm_lifecycle.rb index cc52880..22fbe62 100644 --- a/lib/hyperstack/vm_lifecycle.rb +++ b/lib/hyperstack/vm_lifecycle.rb @@ -110,9 +110,16 @@ module HyperstackVM info "Tracked VM: #{state['vm_id']} #{vm['name']}" info "Status: #{vm['status']} / #{vm['vm_state']}" info "Public IP: #{connect_host_for(vm) || 'none'}" + unless state['provisioned_at'] + info "Provisioning: incomplete — run `create` to resume" + end info "Service mode: #{service_summary(vllm: vllm_e, ollama: ollama_e)}" info "Active model: #{state['vllm_model'] || @config.vllm_model}" if vllm_e info "Missing firewall rules: #{missing.empty? ? 'none' : missing.size}" + state['status'] = vm['status'] + state['vm_state'] = vm['vm_state'] + state['public_ip'] = connect_host_for(vm) || state['public_ip'] + @state_store.save(state) rescue Error => e warn_out "Unable to load VM #{state['vm_id']}: #{e.message}" return state&.dig('public_ip') -- cgit v1.2.3