Class: OsCtld::Commands::Container::LocalTransfer::Config

Inherits:
Base
  • Object
show all
Defined in:
lib/osctld/commands/container/local_transfer/config.rb

Direct Known Subclasses

CopyConfig, MoveConfig

Instance Attribute Summary

Attributes inherited from Base

#client, #client_handler, #id, #opts

Instance Method Summary collapse

Methods inherited from Base

#build_dataset_map, #cleanup_target_container!, #clear_failed_state_snapshot, #complete_target!, #destroy_local_transfer_snapshots, #ensure_target_staged_or_complete!, #find, #force_writeout, #operation, #require_local_transfer_log!, #snapshot_datasets, #snapshot_name, #start_target!, #target_ct, #target_pool, #transfer_dataset, #validate_dataset_layout!

Methods inherited from Logged

#base_execute, #find

Methods inherited from Base

#base_execute, #call_cmd, #call_cmd!, #error, #error!, handle, #handled, #indirect?, #initialize, #manipulate, #manipulation_holder, #ok, #progress, #request_stop, run, run!

Constructor Details

This class inherits a constructor from OsCtld::Commands::Base

Instance Method Details

#create_target_datasets(builder, dataset_map) ⇒ Object (protected)



92
93
94
95
96
97
98
99
# File 'lib/osctld/commands/container/local_transfer/config.rb', line 92

def create_target_datasets(builder, dataset_map)
  dataset_map.each do |pair|
    builder.create_dataset(
      OsCtl::Lib::Zfs::Dataset.new(pair.target, base: builder.ctrc.dataset.name),
      mapping: builder.ctrc.map_mode == 'zfs'
    )
  end
end

#execute(ct) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/osctld/commands/container/local_transfer/config.rb', line 5

def execute(ct)
  target_pool = resolve_target_pool(ct)
  target_user, target_group = resolve_target_user_group(ct, target_pool)

  if DB::Containers.contains?(opts[:target_id], target_pool)
    error!("container #{target_pool.name}:#{opts[:target_id]} already exists")
  end

  new_ct = ct.exclusively do
    if ct.transfer_in_progress?
      error!('this container already has a transfer in progress')
    end

    ct.dup(
      opts[:target_id],
      pool: target_pool,
      user: target_user,
      group: target_group,
      dataset: opts[:target_dataset],
      network_interfaces: opts[:network_interfaces]
    )
  end

  builder = Container::Builder.new(new_ct.new_run_conf, cmd: self)
  error!(builder.errors.join('; ')) unless builder.valid?

  manipulate([ct, new_ct]) do
    unless builder.register
      error!("container #{new_ct.pool.name}:#{new_ct.id} already exists")
    end

    begin
      dataset_map = build_dataset_map(ct, new_ct)

      create_target_datasets(builder, dataset_map)
      new_ct.save_config
      builder.setup_ct_dir
      builder.setup_lxc_home
      builder.setup_lxc_configs
      builder.setup_log_file
      builder.setup_user_hook_script_dir
      builder.monitor

      ct.open_local_transfer_log(
        :source,
        operation:,
        target_pool: new_ct.pool.name,
        target_id: new_ct.id,
        target_dataset: new_ct.dataset.name,
        target_dataset_custom: !opts[:target_dataset].nil?,
        target_user: new_ct.user.name,
        target_group: new_ct.group.name,
        network_interfaces: opts[:network_interfaces],
        datasets: dataset_map
      )
    rescue StandardError
      progress('Error occurred, cleaning up')
      builder.cleanup(dataset: !opts[:target_dataset])
      raise
    end
  end

  call_cmd!(Commands::User::LxcUsernet) if opts[:network_interfaces]
  ok
end

#resolve_target_pool(ct) ⇒ Object (protected)



73
74
75
76
77
78
# File 'lib/osctld/commands/container/local_transfer/config.rb', line 73

def resolve_target_pool(ct)
  target_pool = opts[:target_pool] ? DB::Pools.find(opts[:target_pool]) : ct.pool
  error!('pool not found') unless target_pool

  target_pool
end

#resolve_target_user_group(ct, target_pool) ⇒ Object (protected)



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/osctld/commands/container/local_transfer/config.rb', line 80

def resolve_target_user_group(ct, target_pool)
  return [nil, nil] if target_pool == ct.pool

  target_user = DB::Users.find(opts[:target_user] || ct.user.name, target_pool)
  error!('target user not found') unless target_user

  target_group = DB::Groups.find(opts[:target_group] || ct.group.name, target_pool)
  error!('target group not found') unless target_group

  [target_user, target_group]
end