Class: OsCtld::Container::RunConfiguration

Inherits:
Object
  • Object
show all
Includes:
OsCtl::Lib::Utils::File, OsCtl::Lib::Utils::Log, Lockable
Defined in:
lib/osctld/container/run_configuration.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Lockable

#exclusively, included, #inclusively, #init_lock, #lock, #unlock

Constructor Details

#initialize(ct, load_conf: true) ⇒ RunConfiguration

Returns a new instance of RunConfiguration.

Parameters:



30
31
32
33
34
35
36
37
# File 'lib/osctld/container/run_configuration.rb', line 30

def initialize(ct, load_conf: true)
  init_lock
  @ct = ct
  @init_pid = nil
  @do_reboot = false
  @dist_network_configured = false
  self.load_conf(from_file: load_conf)
end

Instance Attribute Details

#archObject (readonly)

Returns the value of attribute arch



26
27
28
# File 'lib/osctld/container/run_configuration.rb', line 26

def arch
  @arch
end

#ctContainer (readonly)

Returns:



24
25
26
# File 'lib/osctld/container/run_configuration.rb', line 24

def ct
  @ct
end

#datasetObject (readonly)

Returns the value of attribute dataset



26
27
28
# File 'lib/osctld/container/run_configuration.rb', line 26

def dataset
  @dataset
end

#distributionObject (readonly)

Returns the value of attribute distribution



26
27
28
# File 'lib/osctld/container/run_configuration.rb', line 26

def distribution
  @distribution
end

#init_pidObject

Returns the value of attribute init_pid



27
28
29
# File 'lib/osctld/container/run_configuration.rb', line 27

def init_pid
  @init_pid
end

#mountedObject (protected)

Returns the value of attribute mounted



197
198
199
# File 'lib/osctld/container/run_configuration.rb', line 197

def mounted
  @mounted
end

#versionObject (readonly)

Returns the value of attribute version



26
27
28
# File 'lib/osctld/container/run_configuration.rb', line 26

def version
  @version
end

Class Method Details

.load(ct) ⇒ Object

Parameters:



12
13
14
15
16
17
18
19
20
21
# File 'lib/osctld/container/run_configuration.rb', line 12

def self.load(ct)
  ctrc = new(ct, load_conf: false)

  if ctrc.exist?
    ctrc.load_conf
    ctrc
  else
    nil
  end
end

Instance Method Details

#assets(add) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/osctld/container/run_configuration.rb', line 39

def assets(add)
  add.file(
    file_path,
    desc: 'Container runtime configuration',
    user: 0,
    group: 0,
    mode: 0400,
    optional: true,
  )
end

#boot_from(dataset, distribution, version, arch, destroy_dataset_on_stop: false) ⇒ Object

Set custom boot dataset



60
61
62
63
64
65
66
67
68
# File 'lib/osctld/container/run_configuration.rb', line 60

def boot_from(dataset, distribution, version, arch, destroy_dataset_on_stop: false)
  exclusively do
    @dataset = dataset
    @distribution = distribution
    @version = version
    @arch = arch
    @destroy_dataset_on_stop = destroy_dataset_on_stop
  end
end

#destroyObject



191
192
193
194
# File 'lib/osctld/container/run_configuration.rb', line 191

def destroy
  File.unlink(file_path)
rescue Errno::ENOENT
end

#destroy_dataset_on_stop?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/osctld/container/run_configuration.rb', line 70

def destroy_dataset_on_stop?
  inclusively { @destroy_dataset_on_stop }
end

#dirString

Countainer dataset mountpoint

Returns:

  • (String)


76
77
78
# File 'lib/osctld/container/run_configuration.rb', line 76

def dir
  dataset.mountpoint
end

#dir_pathObject (protected)



199
200
201
# File 'lib/osctld/container/run_configuration.rb', line 199

def dir_path
  File.join(ct.pool.ct_dir, ct.id)
end

#dist_configure_networkObject



133
134
135
136
137
138
# File 'lib/osctld/container/run_configuration.rb', line 133

def dist_configure_network
  return unless dist_configure_network?

  DistConfig.run(self, :network)
  exclusively { @dist_network_configured = true }
end

#dist_configure_network?Boolean

Returns:

  • (Boolean)


127
128
129
130
131
# File 'lib/osctld/container/run_configuration.rb', line 127

def dist_configure_network?
  inclusively do
    !@dist_network_configured && can_dist_configure_network?
  end
end

#dumpObject



144
145
146
147
148
149
150
151
152
# File 'lib/osctld/container/run_configuration.rb', line 144

def dump
  {
    'dataset' => dataset.to_s,
    'distribution' => distribution,
    'version' => version,
    'arch' => arch,
    'destroy_dataset_on_stop' => destroy_dataset_on_stop?,
  }
end

#exist?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/osctld/container/run_configuration.rb', line 140

def exist?
  File.exist?(file_path)
end

#file_pathObject (protected)



203
204
205
# File 'lib/osctld/container/run_configuration.rb', line 203

def file_path
  File.join(dir_path, 'config.yml')
end

#load_conf(from_file: true) ⇒ Object



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/osctld/container/run_configuration.rb', line 154

def load_conf(from_file: true)
  cfg =
    if from_file && File.exist?(file_path)
      YAML.load_file(file_path)
    else
      {}
    end

  @dataset =
    if cfg['dataset']
      OsCtl::Lib::Zfs::Dataset.new(cfg['dataset'], base: cfg['dataset'])
    else
      ct.dataset
    end
  @distribution = cfg['distribution'] || ct.distribution
  @version = cfg['version'] || ct.version
  @arch = cfg['arch'] || ct.arch
  @destroy_dataset_on_stop =
    if cfg.has_key?('destroy_dataset_on_stop')
      cfg['destroy_dataset_on_stop']
    else
      false
    end
  nil
end

#mount(force: false) ⇒ Object

Mount the container's dataset

Parameters:

  • force (Boolean) (defaults to: false)

    ensure the datasets are mounted even if osctld already mounted them



94
95
96
97
98
# File 'lib/osctld/container/run_configuration.rb', line 94

def mount(force: false)
  return if !force && mounted
  dataset.mount(recursive: true)
  self.mounted = true
end

#mounted?(force: false) ⇒ Boolean

Check if the container's dataset is mounted

Parameters:

  • force (Boolean) (defaults to: false)

    check if the dataset is mounted even if osctld already mounted it

Returns:

  • (Boolean)


103
104
105
106
107
108
109
# File 'lib/osctld/container/run_configuration.rb', line 103

def mounted?(force: false)
  if force || mounted.nil?
    self.mounted = dataset.mounted?(recursive: true)
  else
    mounted
  end
end

#reboot?Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/osctld/container/run_configuration.rb', line 123

def reboot?
  @do_reboot
end

#request_rebootObject

After the current container run stops, start it again



119
120
121
# File 'lib/osctld/container/run_configuration.rb', line 119

def request_reboot
  @do_reboot = true
end

#rootfsString

Container rootfs path

Returns:

  • (String)


82
83
84
85
86
87
88
89
# File 'lib/osctld/container/run_configuration.rb', line 82

def rootfs
  File.join(dir, 'private')

rescue SystemCommandFailed
  # Dataset for staged containers does not have to exist yet, relevant
  # primarily for ct show/list
  nil
end

#runtime_rootfsObject



111
112
113
114
115
116
# File 'lib/osctld/container/run_configuration.rb', line 111

def runtime_rootfs
  pid = init_pid
  fail 'init_pid not set' unless pid

  File.join('/proc', pid.to_s, 'root')
end

#saveObject



180
181
182
183
184
185
186
187
188
189
# File 'lib/osctld/container/run_configuration.rb', line 180

def save
  begin
    Dir.mkdir(dir_path)
  rescue Errno::EEXIST
  end

  regenerate_file(file_path, 0400) do |new|
    new.write(YAML.dump(dump))
  end
end