Class: OsCtld::Container::RunConfiguration
- Inherits:
-
Object
- Object
- OsCtld::Container::RunConfiguration
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.
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
#arch ⇒ Object
Returns the value of attribute arch
26
27
28
|
# File 'lib/osctld/container/run_configuration.rb', line 26
def arch
@arch
end
|
24
25
26
|
# File 'lib/osctld/container/run_configuration.rb', line 24
def ct
@ct
end
|
#dataset ⇒ Object
Returns the value of attribute dataset
26
27
28
|
# File 'lib/osctld/container/run_configuration.rb', line 26
def dataset
@dataset
end
|
#distribution ⇒ Object
Returns the value of attribute distribution
26
27
28
|
# File 'lib/osctld/container/run_configuration.rb', line 26
def distribution
@distribution
end
|
#init_pid ⇒ Object
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
|
#mounted ⇒ Object
Returns the value of attribute mounted
197
198
199
|
# File 'lib/osctld/container/run_configuration.rb', line 197
def mounted
@mounted
end
|
#version ⇒ Object
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
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
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
|
#destroy ⇒ Object
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
70
71
72
|
# File 'lib/osctld/container/run_configuration.rb', line 70
def destroy_dataset_on_stop?
inclusively { @destroy_dataset_on_stop }
end
|
#dir ⇒ String
Countainer dataset mountpoint
76
77
78
|
# File 'lib/osctld/container/run_configuration.rb', line 76
def dir
dataset.mountpoint
end
|
#dir_path ⇒ Object
199
200
201
|
# File 'lib/osctld/container/run_configuration.rb', line 199
def dir_path
File.join(ct.pool.ct_dir, ct.id)
end
|
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
|
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
|
#dump ⇒ Object
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
140
141
142
|
# File 'lib/osctld/container/run_configuration.rb', line 140
def exist?
File.exist?(file_path)
end
|
#file_path ⇒ Object
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
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
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
123
124
125
|
# File 'lib/osctld/container/run_configuration.rb', line 123
def reboot?
@do_reboot
end
|
#request_reboot ⇒ Object
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
|
#rootfs ⇒ 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
nil
end
|
#runtime_rootfs ⇒ Object
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
|
#save ⇒ Object
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
|