vagabond 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +2 -0
- data/README.md +94 -0
- data/bin/vagabond +6 -0
- data/lib/vagabond.rb +1 -0
- data/lib/vagabond/actions/create.rb +29 -0
- data/lib/vagabond/actions/destroy.rb +31 -0
- data/lib/vagabond/actions/freeze.rb +14 -0
- data/lib/vagabond/actions/provision.rb +31 -0
- data/lib/vagabond/actions/ssh.rb +13 -0
- data/lib/vagabond/actions/status.rb +29 -0
- data/lib/vagabond/actions/thaw.rb +14 -0
- data/lib/vagabond/actions/up.rb +27 -0
- data/lib/vagabond/bootstraps/server.erb +62 -0
- data/lib/vagabond/commands.rb +58 -0
- data/lib/vagabond/config.rb +7 -0
- data/lib/vagabond/cookbooks/lxc/CHANGELOG.md +21 -0
- data/lib/vagabond/cookbooks/lxc/Gemfile +3 -0
- data/lib/vagabond/cookbooks/lxc/Gemfile.lock +132 -0
- data/lib/vagabond/cookbooks/lxc/README.md +83 -0
- data/lib/vagabond/cookbooks/lxc/attributes/default.rb +26 -0
- data/lib/vagabond/cookbooks/lxc/files/default/knife_lxc +228 -0
- data/lib/vagabond/cookbooks/lxc/libraries/lxc.rb +279 -0
- data/lib/vagabond/cookbooks/lxc/libraries/lxc_expanded_resources.rb +40 -0
- data/lib/vagabond/cookbooks/lxc/libraries/lxc_file_config.rb +81 -0
- data/lib/vagabond/cookbooks/lxc/metadata.rb +11 -0
- data/lib/vagabond/cookbooks/lxc/providers/config.rb +82 -0
- data/lib/vagabond/cookbooks/lxc/providers/container.rb +342 -0
- data/lib/vagabond/cookbooks/lxc/providers/fstab.rb +71 -0
- data/lib/vagabond/cookbooks/lxc/providers/interface.rb +99 -0
- data/lib/vagabond/cookbooks/lxc/providers/service.rb +53 -0
- data/lib/vagabond/cookbooks/lxc/recipes/containers.rb +13 -0
- data/lib/vagabond/cookbooks/lxc/recipes/default.rb +45 -0
- data/lib/vagabond/cookbooks/lxc/recipes/install_dependencies.rb +15 -0
- data/lib/vagabond/cookbooks/lxc/recipes/knife.rb +37 -0
- data/lib/vagabond/cookbooks/lxc/resources/#container.rb# +28 -0
- data/lib/vagabond/cookbooks/lxc/resources/config.rb +19 -0
- data/lib/vagabond/cookbooks/lxc/resources/container.rb +28 -0
- data/lib/vagabond/cookbooks/lxc/resources/fstab.rb +11 -0
- data/lib/vagabond/cookbooks/lxc/resources/interface.rb +10 -0
- data/lib/vagabond/cookbooks/lxc/resources/service.rb +5 -0
- data/lib/vagabond/cookbooks/lxc/templates/default/client.rb.erb +13 -0
- data/lib/vagabond/cookbooks/lxc/templates/default/default-lxc.erb +3 -0
- data/lib/vagabond/cookbooks/lxc/templates/default/fstab.erb +5 -0
- data/lib/vagabond/cookbooks/lxc/templates/default/interface.erb +21 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/Kitchenfile +7 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/metadata.rb +2 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/centos_lxc.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/chef-bootstrap.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/lxc_files.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/lxc_templates.rb +0 -0
- data/lib/vagabond/cookbooks/lxc/test/kitchen/cookbooks/lxc_test/recipes/ubuntu_lxc.rb +0 -0
- data/lib/vagabond/cookbooks/vagabond/attributes/default.rb +2 -0
- data/lib/vagabond/cookbooks/vagabond/libraries/vagabond.rb +10 -0
- data/lib/vagabond/cookbooks/vagabond/metadata.rb +6 -0
- data/lib/vagabond/cookbooks/vagabond/recipes/create.rb +3 -0
- data/lib/vagabond/cookbooks/vagabond/recipes/default.rb +30 -0
- data/lib/vagabond/internal_configuration.rb +147 -0
- data/lib/vagabond/server.rb +158 -0
- data/lib/vagabond/vagabond.rb +109 -0
- data/lib/vagabond/vagabondfile.rb +34 -0
- data/lib/vagabond/version.rb +10 -0
- data/vagabond.gemspec +18 -0
- metadata +125 -0
@@ -0,0 +1,342 @@
|
|
1
|
+
def load_current_resource
|
2
|
+
new_resource._lxc Lxc.new(
|
3
|
+
new_resource.name,
|
4
|
+
:base_dir => node[:lxc][:container_directory],
|
5
|
+
:dnsmasq_lease_file => node[:lxc][:dnsmasq_lease_file]
|
6
|
+
)
|
7
|
+
# TODO: Use some actual logic here, sheesh
|
8
|
+
if(new_resource.static_ip && new_resource.static_gateway.nil?)
|
9
|
+
new_resource.static_gateway new_resource.static_ip.sub(/\d+$/, '1')
|
10
|
+
end
|
11
|
+
new_resource.default_bridge node[:lxc][:bridge] unless new_resource.default_bridge
|
12
|
+
new_resource.new_container !new_resource._lxc.exists?
|
13
|
+
end
|
14
|
+
|
15
|
+
action :create do
|
16
|
+
|
17
|
+
#### Add custom key for host based interactions
|
18
|
+
lxc_dir = directory '/opt/hw-lxc-config' do
|
19
|
+
action :nothing
|
20
|
+
end
|
21
|
+
lxc_dir.run_action(:create)
|
22
|
+
|
23
|
+
lxc_key = execute "lxc host_ssh_key" do
|
24
|
+
command "ssh-keygen -P '' -f /opt/hw-lxc-config/id_rsa"
|
25
|
+
creates "/opt/hw-lxc-config/id_rsa"
|
26
|
+
action :nothing
|
27
|
+
end
|
28
|
+
lxc_key.run_action(:run)
|
29
|
+
|
30
|
+
#### Create container
|
31
|
+
execute "lxc create[#{new_resource.name}]" do
|
32
|
+
command "lxc-create -n #{new_resource.name} -t #{new_resource.template} -- #{new_resource.template_opts.to_a.flatten.join(' ')}"
|
33
|
+
only_if do
|
34
|
+
!new_resource._lxc.exists? && new_resource.updated_by_last_action(true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
#### Create container configuration bits
|
39
|
+
if(new_resource.default_config)
|
40
|
+
lxc_config new_resource.name do
|
41
|
+
action :create
|
42
|
+
default_bridge new_resource.default_bridge
|
43
|
+
static_ip new_resource.static_ip
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if(new_resource.default_fstab)
|
48
|
+
lxc_fstab "proc[#{new_resource.name}]" do
|
49
|
+
container new_resource.name
|
50
|
+
file_system 'proc'
|
51
|
+
mount_point 'proc'
|
52
|
+
type 'proc'
|
53
|
+
options %w(nodev noexec nosuid)
|
54
|
+
end
|
55
|
+
|
56
|
+
lxc_fstab "sysfs[#{new_resource.name}]" do
|
57
|
+
container new_resource.name
|
58
|
+
file_system 'sysfs'
|
59
|
+
mount_point 'sys'
|
60
|
+
type 'sysfs'
|
61
|
+
options 'default'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if(new_resource.static_ip)
|
66
|
+
lxc_interface "eth0[#{new_resource.name}]" do
|
67
|
+
container new_resource.name
|
68
|
+
device 'eth0'
|
69
|
+
address new_resource.static_ip
|
70
|
+
netmask new_resource.static_netmask
|
71
|
+
gateway new_resource.static_gateway
|
72
|
+
end
|
73
|
+
|
74
|
+
ruby_block "force container gateway[#{new_resource.name}]" do
|
75
|
+
block do
|
76
|
+
file = Chef::Util::FileEdit.new(
|
77
|
+
::File.join(
|
78
|
+
new_resource._lxc.rootfs, 'etc', 'rc.local'
|
79
|
+
)
|
80
|
+
)
|
81
|
+
file.search_file_delete_line(%r{route add default gw})
|
82
|
+
file.search_file_replace(
|
83
|
+
%r{exit 0$},
|
84
|
+
"route add default gw #{new_resource.static_gateway}\nexit 0"
|
85
|
+
)
|
86
|
+
file.write_file
|
87
|
+
end
|
88
|
+
not_if "grep \"route add default gw #{new_resource.static_gateway}\" #{::File.join(new_resource._lxc.rootfs, 'etc', 'rc.local')}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
#### Ensure host has ssh access into container
|
93
|
+
directory ::File.join(new_resource._lxc.rootfs, 'root', '.ssh')
|
94
|
+
|
95
|
+
file ::File.join(new_resource._lxc.rootfs, 'root', '.ssh', 'authorized_keys') do
|
96
|
+
content "# Chef generated key file\n#{::File.read('/opt/hw-lxc-config/id_rsa.pub')}\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
if(new_resource.chef_enabled || !new_resource.container_commands.empty? || !new_resource.initialize_commands.empty?)
|
100
|
+
if(new_resource.chef_enabled && new_resource.new_container)
|
101
|
+
|
102
|
+
#### Use cached chef package from host if available
|
103
|
+
if(%w(debian ubuntu).include?(new_resource.template) && system('ls /opt/chef*.deb 2>1 > /dev/null'))
|
104
|
+
file_name = Dir.new('/opt').detect do |item|
|
105
|
+
item.start_with?('chef') && item.end_with?('.deb')
|
106
|
+
end
|
107
|
+
if(file_name)
|
108
|
+
execute "lxc copy_chef_full[#{new_resource.name}]" do
|
109
|
+
command "cp /opt/#{file_name} #{::File.join(new_resource._lxc.rootfs, 'opt')}"
|
110
|
+
not_if do
|
111
|
+
::File.exists?(
|
112
|
+
::File.join(new_resource._lxc.rootfs, 'opt', file_name)
|
113
|
+
)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
execute "lxc install_chef_full[#{new_resource.name}]" do
|
118
|
+
action :nothing
|
119
|
+
command "chroot #{new_resource._lxc.rootfs} dpkg -i #{::File.join('/opt', file_name)}"
|
120
|
+
subscribes :run, resources(:execute => "lxc copy_chef_full[#{new_resource.name}]"), :immediately
|
121
|
+
end
|
122
|
+
@chef_installed = true
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# TODO: Add resources for RPM install
|
127
|
+
|
128
|
+
#### Setup chef related bits within container
|
129
|
+
directory ::File.join(new_resource._lxc.rootfs, 'etc', 'chef') do
|
130
|
+
action :create
|
131
|
+
mode 0755
|
132
|
+
end
|
133
|
+
|
134
|
+
template "lxc chef-config[#{new_resource.name}]" do
|
135
|
+
source 'client.rb.erb'
|
136
|
+
cookbook 'lxc'
|
137
|
+
path ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'client.rb')
|
138
|
+
variables(
|
139
|
+
:validation_client => new_resource.validation_client,
|
140
|
+
:node_name => new_resource.node_name || "#{node.name}-#{new_resource.name}",
|
141
|
+
:server_uri => new_resource.server_uri,
|
142
|
+
:chef_environment => new_resource.chef_environment || '_default'
|
143
|
+
)
|
144
|
+
mode 0644
|
145
|
+
end
|
146
|
+
|
147
|
+
file "lxc chef-validator[#{new_resource.name}]" do
|
148
|
+
path ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'validator.pem')
|
149
|
+
content new_resource.validator_pem || node[:lxc][:validator_pem]
|
150
|
+
mode 0600
|
151
|
+
end
|
152
|
+
|
153
|
+
file "lxc chef-runlist[#{new_resource.name}]" do
|
154
|
+
path ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'first_run.json')
|
155
|
+
content({:run_list => new_resource.run_list}.to_json)
|
156
|
+
not_if do
|
157
|
+
::File.exists?(
|
158
|
+
::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'client.pem')
|
159
|
+
)
|
160
|
+
end
|
161
|
+
mode 0644
|
162
|
+
end
|
163
|
+
|
164
|
+
#### Provide data bag secret file if required
|
165
|
+
if(new_resource.copy_data_bag_secret_file)
|
166
|
+
if ::File.readable?(new_resource.data_bag_secret_file)
|
167
|
+
file "lxc chef-data-bag-secret[#{new_resource.name}]" do
|
168
|
+
path ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'encrypted_data_bag_secret')
|
169
|
+
content ::File.open(new_resource.data_bag_secret_file, "rb").read
|
170
|
+
mode 0600
|
171
|
+
end
|
172
|
+
else
|
173
|
+
Chef::Log.warn "Could not read #{new_resource.data_bag_secret_file}"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
ruby_block "lxc start[#{new_resource.name}]" do
|
179
|
+
block do
|
180
|
+
new_resource._lxc.start
|
181
|
+
end
|
182
|
+
only_if do
|
183
|
+
::File.exists?(
|
184
|
+
::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'first_run.json')
|
185
|
+
) || (new_resource.new_container && new_resource.initialize_commands)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
if(new_resource.chef_enabled && new_resource.new_container)
|
190
|
+
# Make sure we have chef in the container
|
191
|
+
unless(@chef_installed)
|
192
|
+
# Use remote file to remove curl dep
|
193
|
+
remote_file "lxc chef_install_script[#{new_resource.name}]" do
|
194
|
+
source "http://opscode.com/chef/install.sh"
|
195
|
+
path ::File.join(new_resource._lxc.rootfs, 'opt', 'chef-install.sh')
|
196
|
+
action :create_if_missing
|
197
|
+
end
|
198
|
+
|
199
|
+
ruby_block "lxc install_chef[#{new_resource.name}]" do
|
200
|
+
block do
|
201
|
+
new_resource._lxc.container_command(
|
202
|
+
"bash /opt/chef-install.sh"
|
203
|
+
)
|
204
|
+
end
|
205
|
+
not_if do
|
206
|
+
::File.exists?(
|
207
|
+
::File.join(new_resource._lxc.rootfs, 'usr', 'bin', 'chef-client')
|
208
|
+
)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
#### Let chef configure the container
|
214
|
+
ruby_block "lxc run_chef[#{new_resource.name}]" do
|
215
|
+
block do
|
216
|
+
new_resource._lxc.container_command(
|
217
|
+
"chef-client -K /etc/chef/validator.pem -c /etc/chef/client.rb -j /etc/chef/first_run.json",
|
218
|
+
new_resource.chef_retries
|
219
|
+
)
|
220
|
+
end
|
221
|
+
not_if do
|
222
|
+
::File.exists?(
|
223
|
+
::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'client.pem')
|
224
|
+
)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
#### Have initialize commands for the container? Run them now
|
230
|
+
if(new_resource.new_container && !new_resource.initialize_commands.empty?)
|
231
|
+
ruby_block "lxc initialize_commands[#{new_resource.name}]" do
|
232
|
+
block do
|
233
|
+
new_resource.initialize_commands.each do |cmd|
|
234
|
+
new_resource._lxc.container_command(cmd, 2)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
#### Have commands for the container? Run them now
|
241
|
+
unless(new_resource.container_commands.empty?)
|
242
|
+
ruby_block "lxc container_commands[#{new_resource.name}]" do
|
243
|
+
block do
|
244
|
+
new_resource.container_commands.each do |cmd|
|
245
|
+
new_resource._lxc.container_command(cmd, 2)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
#### NOTE: Creation always leaves the container in a stopped state
|
252
|
+
ruby_block "lxc shutdown[#{new_resource.name}]" do
|
253
|
+
block do
|
254
|
+
new_resource._lxc.shutdown
|
255
|
+
end
|
256
|
+
only_if do
|
257
|
+
new_resource.new_container
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
#### Clean up after chef if it's enabled
|
262
|
+
if(new_resource.chef_enabled)
|
263
|
+
file ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'first_run.json') do
|
264
|
+
action :delete
|
265
|
+
end
|
266
|
+
|
267
|
+
file ::File.join(new_resource._lxc.rootfs, 'etc', 'chef', 'validator.pem') do
|
268
|
+
action :delete
|
269
|
+
end
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
end
|
274
|
+
|
275
|
+
action :delete do
|
276
|
+
ruby_block "lxc stop[#{new_resource.name}]" do
|
277
|
+
block do
|
278
|
+
new_resource._lxc.stop
|
279
|
+
end
|
280
|
+
only_if do
|
281
|
+
new_resource._lxc.running?
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
execute "lxc delete[#{new_resource.name}]" do
|
286
|
+
command "lxc-destroy -n #{new_resource.name}"
|
287
|
+
only_if do
|
288
|
+
new_resource._lxc.exists? && new_resource.updated_by_last_action(true)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
action :clone do
|
294
|
+
execute "lxc clone[#{new_resource.base_container} -> #{new_resource.name}]" do
|
295
|
+
command "lxc-clone -o #{new_resource.base_container} -n #{new_resource.name}"
|
296
|
+
only_if do
|
297
|
+
!new_resource._lxc.exists? && new_resource.updated_by_last_action(true)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
lxc_service "lxc config_restart[#{new_resource.name}]" do
|
302
|
+
service_name new_resource.name
|
303
|
+
action :nothing
|
304
|
+
only_if do
|
305
|
+
new_resource._lxc.running?
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
lxc_config new_resource.name do
|
310
|
+
config new_resource.config
|
311
|
+
action :create
|
312
|
+
notifies :restart, resources(:lxc_service => "lxc config_restart[#{new_resource.name}]"), :immediately
|
313
|
+
end
|
314
|
+
|
315
|
+
if(new_resource.chef_enabled)
|
316
|
+
ruby_block "lxc start[#{new_resource.name}]" do
|
317
|
+
block do
|
318
|
+
new_resource._lxc.start
|
319
|
+
end
|
320
|
+
action :nothing
|
321
|
+
subscribes :create, resources(:execute => "lxc clone[#{new_resource.base_container} -> #{new_resource.name}]"), :immediately
|
322
|
+
end
|
323
|
+
|
324
|
+
ruby_block "lxc run_chef[#{new_resource.name}]" do
|
325
|
+
block do
|
326
|
+
new_resource._lxc.container_command(
|
327
|
+
"chef-client -K /etc/chef/validator.pem -c /etc/chef/client.rb -j /etc/chef/first_run.json", 3
|
328
|
+
)
|
329
|
+
end
|
330
|
+
action :nothing
|
331
|
+
subscribes :create, resources(:execute => "lxc clone[#{new_resource.base_container} -> #{new_resource.name}]"), :immediately
|
332
|
+
end
|
333
|
+
|
334
|
+
ruby_block "lxc shutdown[#{new_resource.name}]" do
|
335
|
+
block do
|
336
|
+
new_resource._lxc.shutdown
|
337
|
+
end
|
338
|
+
action :nothing
|
339
|
+
subscribes :create, resources(:execute => "lxc clone[#{new_resource.base_container} -> #{new_resource.name}]"), :immediately
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
def load_current_resource
|
2
|
+
new_resource._lxc Lxc.new(
|
3
|
+
new_resource.container,
|
4
|
+
:base_dir => node[:lxc][:container_directory],
|
5
|
+
:dnsmasq_lease_file => node[:lxc][:dnsmasq_lease_file]
|
6
|
+
)
|
7
|
+
@loaded ||= {}
|
8
|
+
node.run_state[:lxc] ||= Mash.new
|
9
|
+
node.run_state[:lxc][:fstabs] ||= Mash.new
|
10
|
+
node.run_state[:lxc][:fstabs][new_resource.container] ||= []
|
11
|
+
end
|
12
|
+
|
13
|
+
action :create do
|
14
|
+
unless(@loaded[new_resource.container])
|
15
|
+
@loaded[new_resource.container] = true
|
16
|
+
ruby_block "lxc_fstab_notifier[#{new_resource.container}]" do
|
17
|
+
action :create
|
18
|
+
block{ true }
|
19
|
+
only_if do
|
20
|
+
new_resource.updated_by_last_action?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
template ::File.join(new_resource._lxc.container_path, 'fstab') do
|
24
|
+
cookbook 'lxc'
|
25
|
+
source 'fstab.erb'
|
26
|
+
mode 0644
|
27
|
+
variables :container => new_resource.container
|
28
|
+
subscribes :create, resources(:ruby_block => "lxc_fstab_notifier[#{new_resource.container}]"), :delayed
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
line = "#{new_resource.file_system}\t#{new_resource.mount_point}\t" <<
|
33
|
+
"#{new_resource.type}\t#{Array(new_resource.options).join(',')}\t" <<
|
34
|
+
"#{new_resource.dump}\t#{new_resource.pass}"
|
35
|
+
|
36
|
+
unless(node.run_state[:lxc][:fstabs][new_resource.container].include?(line))
|
37
|
+
node.run_state[:lxc][:fstabs][new_resource.container] << line
|
38
|
+
new_resource.updated_by_last_action(true)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
action :delete do
|
44
|
+
unless(@loaded[new_resource.container])
|
45
|
+
@loaded[new_resource.container] = true
|
46
|
+
|
47
|
+
ruby_block "lxc_fstab_notifier[#{new_resource.container}]" do
|
48
|
+
action :create
|
49
|
+
block{ true }
|
50
|
+
only_if do
|
51
|
+
new_resource.updated_by_last_action?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
template ::File.join(new_resource._lxc.container_path, 'fstab') do
|
56
|
+
cookbook 'lxc'
|
57
|
+
source 'fstab.erb'
|
58
|
+
mode 0644
|
59
|
+
variables :container => new_resource.container
|
60
|
+
subscribes :create, resources(:ruby_block => "lxc_fstab_notifier[#{new_resource.container}]"), :delayed
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
line = "#{new_resource.file_system}\t#{new_resource.mount_point}\t" <<
|
65
|
+
"#{new_resource.type}\t#{Array(new_resource.options).join(' ')}\t" <<
|
66
|
+
"#{new_resource.dump}\t#{new_resource.pass}"
|
67
|
+
if(node.run_state[:lxc][:fstabs][new_resource.container].include?(line))
|
68
|
+
node.run_state[:lxc][:fstabs][new_resource.container].delete(line)
|
69
|
+
new_resource.updated_by_last_action(true)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
def load_current_resource
|
2
|
+
@lxc = Lxc.new(
|
3
|
+
new_resource.container,
|
4
|
+
:base_dir => node[:lxc][:container_directory],
|
5
|
+
:dnsmasq_lease_file => node[:lxc][:dnsmasq_lease_file]
|
6
|
+
)
|
7
|
+
@loaded ||= {}
|
8
|
+
# value checks
|
9
|
+
unless(new_resource.dynamic)
|
10
|
+
%w(address netmask).each do |key|
|
11
|
+
raise "#{key} is required for static interfaces" if new_resource.send(key).nil?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
# address checks
|
15
|
+
unless(new_resource.dynamic)
|
16
|
+
%w(address).each do |key|
|
17
|
+
new_resource.send(key).split('.').each do |oct|
|
18
|
+
raise "#{key} is not a valid address" if oct.to_i > 254
|
19
|
+
end
|
20
|
+
end
|
21
|
+
new_resource.netmask.split('.').each do |oct|
|
22
|
+
raise 'netmask is not valid' if oct.to_i > 255
|
23
|
+
end
|
24
|
+
end
|
25
|
+
interfaces = node[:lxc][:interfaces] || Mash.new
|
26
|
+
interfaces[new_resource.container] ||= []
|
27
|
+
node[:lxc][:interfaces] = interfaces
|
28
|
+
end
|
29
|
+
|
30
|
+
action :create do
|
31
|
+
unless(@loaded[new_resource.container])
|
32
|
+
@loaded[new_resource.container] = true
|
33
|
+
ruby_block "lxc_interface_notifier[#{new_resource.container}]" do
|
34
|
+
action :create
|
35
|
+
block{ true }
|
36
|
+
only_if do
|
37
|
+
new_resource.updated_by_last_action?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
template ::File.join(@lxc.rootfs, 'etc', 'network', 'interfaces') do
|
41
|
+
source 'interface.erb'
|
42
|
+
cookbook 'lxc'
|
43
|
+
variables :container => new_resource.container
|
44
|
+
subscribes :create, resources(:ruby_block => "lxc_interface_notifier[#{new_resource.container}]"), :delayed
|
45
|
+
mode 0644
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
net_set = Mash.new(:device => new_resource.device)
|
50
|
+
if(new_resource.dynamic)
|
51
|
+
net_set[:dynamic] = true
|
52
|
+
else
|
53
|
+
net_set[:address] = new_resource.address
|
54
|
+
net_set[:gateway] = new_resource.gateway
|
55
|
+
net_set[:netmask] = new_resource.netmask
|
56
|
+
end
|
57
|
+
|
58
|
+
unless(node[:lxc][:interfaces][new_resource.container].include?(net_set))
|
59
|
+
current_interfaces = node[:lxc][:interfaces][new_resource.container].dup
|
60
|
+
current_interfaces << net_set
|
61
|
+
node[:lxc][:interfaces][new_resource.contaienr] = current_interfaces
|
62
|
+
new_resource.updated_by_last_action(true)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
action :delete do
|
67
|
+
unless(@loaded[new_resource.container])
|
68
|
+
@loaded[new_resource.container] = true
|
69
|
+
ruby_block "lxc_interface_notifier[#{new_resource.container}]" do
|
70
|
+
action :create
|
71
|
+
block{ true }
|
72
|
+
only_if do
|
73
|
+
new_resource.updated_by_last_action?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
template ::File.join(@lxc.rootfs, 'etc', 'interfaces') do
|
77
|
+
cookbook 'lxc'
|
78
|
+
source 'interface.erb'
|
79
|
+
variables :container => new_resource.container
|
80
|
+
subscribes :create, resources(:ruby_block => "lxc_interface_notifier[#{new_resource.container}]"), :delayed
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
net_set = Mash.new(:device => new_resource.device)
|
85
|
+
if(new_resource.dynamic)
|
86
|
+
net_set[:dynamic] = true
|
87
|
+
else
|
88
|
+
net_set[:address] = new_resource.address
|
89
|
+
net_set[:gateway] = new_resource.gateway
|
90
|
+
net_set[:netmask] = new_resource.netmask
|
91
|
+
end
|
92
|
+
|
93
|
+
if(node[:lxc][:interfaces][new_resource.container].include?(net_set))
|
94
|
+
current_interfaces = node[:lxc][:interfaces][new_resource.container].dup
|
95
|
+
current_interfaces.delete(net_set)
|
96
|
+
node[:lxc][:interfaces][new_resource.contaienr] = current_interfaces
|
97
|
+
new_resource.updated_by_last_action(true)
|
98
|
+
end
|
99
|
+
end
|