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:



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

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

Instance Attribute Details

#aborted=(value) ⇒ Object (writeonly)

Sets the attribute aborted

Parameters:

  • value

    the value to set the attribute aborted to.



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

def aborted=(value)
  @aborted = value
end

#archObject (readonly)

Returns the value of attribute arch



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

def arch
  @arch
end

#cpu_packageObject

Returns the value of attribute cpu_package



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

def cpu_package
  @cpu_package
end

#ctContainer (readonly)

Returns:



21
22
23
# File 'lib/osctld/container/run_configuration.rb', line 21

def ct
  @ct
end

#datasetObject (readonly)

Returns the value of attribute dataset



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

def dataset
  @dataset
end

#dist_network_configuredObject

Returns the value of attribute dist_network_configured



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

def dist_network_configured
  @dist_network_configured
end

#distributionObject (readonly)

Returns the value of attribute distribution



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

def distribution
  @distribution
end

#init_pidObject

Returns the value of attribute init_pid



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

def init_pid
  @init_pid
end

#mountedObject (protected)

Returns the value of attribute mounted



201
202
203
# File 'lib/osctld/container/run_configuration.rb', line 201

def mounted
  @mounted
end

#versionObject (readonly)

Returns the value of attribute version



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

def version
  @version
end

Class Method Details

.load(ct) ⇒ Object

Parameters:



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

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

  return unless ctrc.exist?

  ctrc.load_conf
  ctrc
end

Instance Method Details

#aborted?Boolean

Returns:

  • (Boolean)


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

def aborted?
  @aborted
end

#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: 0o400,
    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



193
194
195
196
197
# File 'lib/osctld/container/run_configuration.rb', line 193

def destroy
  File.unlink(file_path)
rescue Errno::ENOENT
  # ignore
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)



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

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

#dist_configure_network?Boolean

Returns:

  • (Boolean)


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

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

#dumpObject



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

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

#exist?Boolean

Returns:

  • (Boolean)


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

def exist?
  File.exist?(file_path)
end

#file_pathObject (protected)



207
208
209
# File 'lib/osctld/container/run_configuration.rb', line 207

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
179
# File 'lib/osctld/container/run_configuration.rb', line 154

def load_conf(from_file: true)
  cfg =
    if from_file && File.exist?(file_path)
      OsCtl::Lib::ConfigFile.load_yaml_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
  @cpu_package = cfg['cpu_package']
  @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



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

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)


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

def reboot?
  @do_reboot
end

#request_rebootObject

After the current container run stops, start it again



125
126
127
# File 'lib/osctld/container/run_configuration.rb', line 125

def request_reboot
  @do_reboot = true
end

#rootfsString

Container rootfs path

Returns:

  • (String)


82
83
84
85
86
87
88
# 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
  raise 'init_pid not set' unless pid

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

#saveObject



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

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

  regenerate_file(file_path, 0o400) do |new|
    new.write(OsCtl::Lib::ConfigFile.dump_yaml(dump))
  end
end