Class: Pvectl::Wizards::CreateContainer

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/wizards/create_container.rb,
sig/pvectl/wizards/create_container.rbs

Overview

Interactive wizard for creating an LXC container step by step.

Uses TTY::Prompt (when available) or a fallback prompt to guide the user through container configuration. Returns a normalized params hash compatible with Services::CreateContainer, or nil if the user cancels.

Examples:

Running the wizard

wizard = CreateContainer.new(options, global_options)
params = wizard.run
#=> { hostname: "web-ct", node: "pve1", ... } or nil

Instance Method Summary collapse

Constructor Details

#initialize(options, global_options, prompt: nil) ⇒ CreateContainer

Creates a new CreateContainer wizard.

Parameters:

  • options (Hash)

    command options (may contain pre-filled values)

  • global_options (Hash)

    global CLI options

  • prompt (Object) (defaults to: nil)

    prompt instance (injectable for testing)

  • prompt: (Object) (defaults to: nil)


22
23
24
25
26
# File 'lib/pvectl/wizards/create_container.rb', line 22

def initialize(options, global_options, prompt: nil)
  @options = options
  @global_options = global_options
  @prompt = prompt || create_default_prompt
end

Instance Method Details

#collect_mountpointsArray<Hash>?

Collects mountpoint configurations interactively.

Returns:

  • (Array<Hash>, nil)

    mountpoint configs or nil if none added



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/pvectl/wizards/create_container.rb', line 77

def collect_mountpoints
  mps = []
  loop do
    input = @prompt.ask("Mountpoint (mp=/path,storage=X,size=Y) or empty to skip:")
    break if input.nil? || input.empty?

    mps << Parsers::LxcMountConfig.parse(input)
    break unless @prompt.yes?("Add another mountpoint?")
  end
  mps.empty? ? nil : mps
end

#collect_netsArray<Hash>?

Collects network configurations interactively.

Returns:

  • (Array<Hash>, nil)

    net configs or nil if none added



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/pvectl/wizards/create_container.rb', line 92

def collect_nets
  nets = []
  loop do
    input = @prompt.ask("Network config (bridge=X[,ip=Y]) or empty to skip:")
    break if input.nil? || input.empty?

    nets << Parsers::LxcNetConfig.parse(input)
    break unless @prompt.yes?("Add another network?")
  end
  nets.empty? ? nil : nets
end

#collect_paramsHash

Collects all parameters interactively.

Returns:

  • (Hash)

    collected parameters



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/pvectl/wizards/create_container.rb', line 50

def collect_params
  params = {}
  params[:hostname] = @prompt.ask("Container hostname:", required: true)
  params[:ostemplate] = @prompt.ask("OS template path:", required: true)
  params[:node] = @prompt.ask("Node:", default: @options[:node])
  params[:cores] = @prompt.ask("CPU cores:", default: 1, convert: :int)
  params[:memory] = @prompt.ask("Memory (MB):", default: 512, convert: :int)
  params[:swap] = @prompt.ask("Swap (MB):", default: 512, convert: :int)
  params[:rootfs] = collect_rootfs
  params[:mountpoints] = collect_mountpoints
  params[:nets] = collect_nets
  params[:privileged] = true unless @prompt.yes?("Unprivileged container?", default: true)
  params[:start] = true if @prompt.yes?("Start container after creation?")
  params.compact
end

#collect_rootfsHash

Collects root filesystem configuration.

Returns:

  • (Hash)

    parsed rootfs config



69
70
71
72
# File 'lib/pvectl/wizards/create_container.rb', line 69

def collect_rootfs
  input = @prompt.ask("Root FS (storage=X,size=Y):", required: true)
  Parsers::LxcMountConfig.parse(input)
end

#create_default_promptObject

Creates a default prompt, preferring TTY::Prompt with SimplePrompt fallback.

Returns:

  • (Object)

    prompt object



40
41
42
43
44
45
# File 'lib/pvectl/wizards/create_container.rb', line 40

def create_default_prompt
  require "tty-prompt"
  TTY::Prompt.new
rescue LoadError
  Config::SimplePrompt.new
end

#runHash?

Runs the wizard and returns params or nil if cancelled.

Returns:

  • (Hash, nil)

    creation params or nil if user cancels



31
32
33
# File 'lib/pvectl/wizards/create_container.rb', line 31

def run
  collect_params
end